我有一个帮助函数,它允许我在不同的上下文中调用函数。这很简单:
function delegate(that, thatMethod)
{
return function() { return thatMethod.apply(that,arguments); }
}
如果我在执行函数时不评估变量,这是可以的,但有时我想给出在构造时固定的委托函数值。
样品:
var callbacks = new Array();
for(var i = 0; i < 5; i++)
{
callbacks.push(delegate(window, function() { alert(i) }));
}
callbacks[3]();
在这种情况下,我的预期行为是我得到警报(3),但因为 i 在执行时被评估,我们没有。
我知道还有另一个委托功能,如下所示:
function delegatedd( that, thatMethod )
{
if(arguments.length > 2)
{
var _params = [];
for(var n = 2; n < arguments.length; ++n)
_params.push(arguments[n]);
return function() { return thatMethod.apply(that,_params); }
}
else
return function() { return thatMethod.call(that); }
}
但这对我没有帮助,因为我想混合两种方法。它可以这样写(使用委托的第一个版本):
function(foo) {
return delegate(window, function() {
alert(foo);
});
}(i)
所以我是施工时间和其他所有执行时间。
这种情况的不足之处在于它看起来很丑陋。有没有更好的方法呢?我可以以某种方式将其隐藏在一个函数中吗?
由于
答案 0 :(得分:1)
您可以使用绑定功能:
var callbacks = new Array();
for(var i = 0; i < 5; i++)
{
//callbacks.push(delegate(window, function() { alert(i) }));
callbacks.push(function(n) { alert(n) }.bind(window, i);
}
callbacks[3]();
但是IE上没有实现bind(不知道IE9),关于如何在IE上使用它,请参阅https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind#Compatibility。