使用参数传递Javascript函数而不执行它的最佳做法是什么?

时间:2015-02-19 16:08:42

标签: javascript anonymous-function partial-application

使用参数传递Javascript函数而不执行它的最有效/最佳实践是什么?为什么?这是我所知道的选择:

制作匿名方法

jQuery("#target").click(function() {
    onTargetClick("myCoolParam");
});

function onTargetClick(coolParam) {
    // some epic code...
}

使用部分功能应用 (见:Partial function application

jQuery("#target").click(partial(onTargetClick, "myCoolParam"));

function onTargetClick(coolParam) {
    // some epic code...
}

function partial(func /*, 0..n args */) {
    var args = Array.prototype.slice.call(arguments).splice(1);
    return function() {
        var allArguments = args.concat(Array.prototype.slice.call(arguments));
        return func.apply(this, allArguments);
    };
}

编辑部分功能

function partial(func /*, 0..n args */) {
    var args = Array.prototype.slice.call(arguments, 1);
    return function() {
        var allArguments = args.concat(Array.prototype.slice.call(arguments));
        return func.apply(this, allArguments);
    };
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我会使用允许传递其他参数的Function.prototype.bind

jQuery("#target").click(onTargetClick.bind(null, "myCoolParam"));

答案 1 :(得分:2)

取决于

使用第一个示例中的包装函数是直接的,易于阅读的,实用的,并且在现代引擎上不太可能产生令人不快的副作用,这些副作用与您在其中使用它的上下文中的闭包有关(因为现代引擎在许多情况下优化了琐碎的闭包)。使用较旧的引擎,没有优化闭包,它可能会导致事物被不必要地保存在内存中(并且仍然可以使用更复杂的闭包;但是诸如你的那些没有使用{{1 }},evalnew Function,它们只引用一个大概不在包含立即数的上下文中声明的变量,是优化的理想选择。)

使用JavaScript with可以避免关闭问题;更简洁一点;在现代发动机上,很可能非常高效(而不是在需要进行多层填充的旧发动机上低效)。但它确实会破坏Function#bind值,这可能是事件处理程序中的问题(尽管您在示例中没有使用this)。

使用像this或PrototypeJS' partial这样的函数也有避免关闭问题和简洁的好处,不太可能 ,并使用为其生成的函数赋予的Function#curry值。它们的缺点是不标准,所以你必须提供它们,阅读代码的人必须了解它们的作用。

选择。