Делегаты - Строительство / Исполнение -Время-Параметр - PullRequest
0 голосов
/ 27 июля 2011

У меня есть вспомогательная функция, которая позволяет мне вызывать функции в другом контексте. Все довольно просто:

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)

Итак, i - это время строительства и все остальное время выполнения.
Недостаток этого в том, что это выглядит довольно некрасиво. Есть ли лучший способ сделать это? Можно ли как-то скрыть это в функции?

Спасибо

1 Ответ

1 голос
/ 27 июля 2011

Вы можете использовать функцию связывания:

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 (не знаю о IE9), для того, как заставить его работать в IE см. https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind#Compatibility.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...