代表 - 构造/执行 - 时间参数

时间:2011-07-26 23:38:54

标签: javascript delegates

我有一个帮助函数,它允许我在不同的上下文中调用函数。这很简单:

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)

所以是施工时间和其他所有执行时间。
这种情况的不足之处在于它看起来很丑陋。有没有更好的方法呢?我可以以某种方式将其隐藏在一个函数中吗?

由于

1 个答案:

答案 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