使用参数传递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);
};
}
感谢您的帮助。
答案 0 :(得分:2)
我会使用允许传递其他参数的Function.prototype.bind
:
jQuery("#target").click(onTargetClick.bind(null, "myCoolParam"));
答案 1 :(得分:2)
取决于
使用第一个示例中的包装函数是直接的,易于阅读的,实用的,并且在现代引擎上不太可能产生令人不快的副作用,这些副作用与您在其中使用它的上下文中的闭包有关(因为现代引擎在许多情况下优化了琐碎的闭包)。使用较旧的引擎,没有优化闭包,它可能会导致事物被不必要地保存在内存中(并且仍然可以使用更复杂的闭包;但是诸如你的那些没有使用{{1 }},eval
或new Function
,它们只引用一个大概不在包含立即数的上下文中声明的变量,是优化的理想选择。)
使用JavaScript with
可以避免关闭问题;更简洁一点;在现代发动机上,很可能非常高效(而不是在需要进行多层填充的旧发动机上低效)。但它确实会破坏Function#bind
值,这可能是事件处理程序中的问题(尽管您在示例中没有使用this
)。
使用像this
或PrototypeJS' partial
这样的函数也有避免关闭问题和简洁的好处,不太可能 ,并使用为其生成的函数赋予的Function#curry
值。它们的缺点是不标准,所以你必须提供它们,阅读代码的人必须了解它们的作用。
选择。