У меня есть вспомогательная функция, которая позволяет мне вызывать функции в другом контексте. Все довольно просто:
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 - это время строительства и все остальное время выполнения.
Недостаток этого в том, что это выглядит довольно некрасиво. Есть ли лучший способ сделать это? Можно ли как-то скрыть это в функции?
Спасибо