【问题标题】:Reduce boilerplate of adding functions to a function queue减少将函数添加到函数队列的样板
【发布时间】:2011-02-11 05:43:53
【问题描述】:

我正在处理 JavaScript 中的动画,我有一堆函数可以调用来将内容添加到动画队列中。基本上,所有这些函数都是这样的:

function foo(arg1, arg2) {
    _eventQueue.push(function() {
        // actual logic
    }
 }

我现在想知道是否可以稍微减少这个样板,所以我不需要在每个函数体中多次添加额外的“_eventQueue”行。例如,是否有可能创建一个辅助函数,它将任意函数作为参数并返回一个新函数,该函数被扩充以自动添加到事件队列中?唯一的问题是我需要在这个过程中找到一种方法来保持对函数原始参数的访问,这很复杂。

【问题讨论】:

    标签: javascript metaprogramming


    【解决方案1】:

    您正在寻找 arguments 标识符,它提供了一个类似数组的对象,其中包含传递给当前函数的参数。

    例如:

    function createEnqueuer(func) {
        return function() {
            var outerArgs = arguments;
    
            _eventQueue.push(function() {
                return func.apply(window, outerArgs);
            });
        };
    }
    

    【讨论】:

    • 该死,打败我。但是,我不确定我是否同意在将this 设置为window 的情况下调用apply。尽管此代码当前遵循现有的 JavaScript 约定(通过匹配 this 在您调用函数而不是方法时设置的内容),但它提供的好处很少,并且在 EMCAScript 5 中可能会发生变化。如果我没记错的话, this 将被设置为 undefined。免责声明:我绝不是该主题的专家;我昨天刚好看到这个:yuiblog.com/blog/2010/02/24/video-crockonjs-3 .
    • 您能看到致电func.apply(this, outerArgs) 的任何潜在问题吗?
    • 太棒了...这是如何工作的?我会假设 arguments 数组将保存 createEnqueuer 函数的参数,而不是 func 函数。
    • @thurn:arguments 关键字给出了它所引用的任何函数的参数。(即使该函数没有声明任何参数)
    • @SLaks:哦!我知道了。 'arguments' 指的是您返回的匿名函数的参数,但它是 invoked 与原始函数的所有参数。我很困惑,因为我忘记了您不必在签名中声明函数的所有参数……您只需将它们传入并通过参数数组访问它们。这是一些很酷的东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2022-07-20
    • 2016-01-31
    • 2015-04-08
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多