在不执行函数的情况下传递带参数的 Javascript 函数的最佳做法是什么?
What's the best practice for passing a Javascript function with parameters without executing it?
传递带参数的 Javascript 函数而不执行它的最 efficient/the 最佳实践是什么?为什么?这是我知道的选择:
做一个匿名方法
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);
};
}
感谢您的帮助。
我会使用 Function.prototype.bind
允许传递额外的参数:
jQuery("#target").click(onTargetClick.bind(null, "myCoolParam"));
视情况而定
在您的第一个示例中使用包装函数是直接的、易于阅读的、实用的,并且在现代引擎上不太可能产生与您正在使用它的上下文相关的令人不快的副作用(因为在许多情况下,现代引擎会优化琐碎的闭包)。对于没有优化闭包的旧引擎,它可能会导致不必要地把东西保存在内存中(并且仍然可以,使用更复杂的闭包;但是像你这样的引擎不使用 eval
,new Function
或 with
,并且它只引用一个可能未在立即包含的上下文中声明的变量,是一个很好的优化候选对象。
使用JavaScript的Function#bind
避免了闭包问题;更简洁一点;并且在现代引擎上可能非常高效(虽然在需要填充的旧引擎上不是 低效)。但是,它确实弄乱了 this
值,这可能是事件处理程序中的一个问题(尽管您在示例中没有使用 this
)。
使用像你的partial
或PrototypeJS的Function#curry
这样的函数也有避免闭包问题和简洁的好处,不太可能是在高效,并使用赋予它们生成的函数的 this
值。它们的缺点是不标准,因此您必须提供它们,并且阅读您的代码的人必须了解它们的作用。
请选择。
传递带参数的 Javascript 函数而不执行它的最 efficient/the 最佳实践是什么?为什么?这是我知道的选择:
做一个匿名方法
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);
};
}
感谢您的帮助。
我会使用 Function.prototype.bind
允许传递额外的参数:
jQuery("#target").click(onTargetClick.bind(null, "myCoolParam"));
视情况而定
在您的第一个示例中使用包装函数是直接的、易于阅读的、实用的,并且在现代引擎上不太可能产生与您正在使用它的上下文相关的令人不快的副作用(因为在许多情况下,现代引擎会优化琐碎的闭包)。对于没有优化闭包的旧引擎,它可能会导致不必要地把东西保存在内存中(并且仍然可以,使用更复杂的闭包;但是像你这样的引擎不使用 eval
,new Function
或 with
,并且它只引用一个可能未在立即包含的上下文中声明的变量,是一个很好的优化候选对象。
使用JavaScript的Function#bind
避免了闭包问题;更简洁一点;并且在现代引擎上可能非常高效(虽然在需要填充的旧引擎上不是 低效)。但是,它确实弄乱了 this
值,这可能是事件处理程序中的一个问题(尽管您在示例中没有使用 this
)。
使用像你的partial
或PrototypeJS的Function#curry
这样的函数也有避免闭包问题和简洁的好处,不太可能是在高效,并使用赋予它们生成的函数的 this
值。它们的缺点是不标准,因此您必须提供它们,并且阅读您的代码的人必须了解它们的作用。
请选择。