call stack

berkut

Новичок
call stack

подтупливаю, даже название не смог сформулировать... подскажите, как разрешить ситуёвину:
Код:
var ats = document.forms;
for (var i = 0; ats && i < ats.length; ++i) {
    new Ajax.Request(...., {onSucces: function() { ats[i].getElementsByTagName('button')[0].disabled = true; });
}
вот собсна в момент вызова onSuccess ats какбы уже недоступен...

-~{}~ 13.04.09 18:22:

т.е. i уже больше макс значения..
 

Dl

Новичок
А если попробовать с помощью дополнительной переменной?
 

berkut

Новичок
Grezz
а толку??

-~{}~ 13.04.09 18:49:

вообщем на прототипе это решил bind-ом. хз как оно работает, но работает.
 

dimagolov

Новичок
berkut, не совсем понял что и когда у тебя недоступно, но на всякий случай уточню, у тебя в замыканиях i (счетчик цикла) не фигурировал? потому что его значение всегда при вызове замыкания будет определятся, то есть уже после окончания цикла и всегда будет равно ats.length
 

berkut

Новичок
dimagolov об этом я и написал в конце первого поста.
если абстрогироваться от прототайпа, то история такая:
Код:
var callbacks = {};
var myFunc = function(a, b, number)
{
    alert(number);
}
for (var i = 0; i < 3; ++i) {
    callbacks[i] = myFunc; // ???
}
и есть неподвластный редактированию код(прототайп), который пробегается по всем элементам строго callbacks и вызывает функции передавая в них 2 своих параметра.
вот собсно нужно, чтобы как-то туда передавалось значение i, которое было при присвоении...

короче жуть чо понаписал...
 

dimagolov

Новичок
реально можно сделать только так:
Код:
callbacks[0] = function () { myFunc(a, b, 0) };
callbacks[1] = function () { myFunc(a, b, 1) };
callbacks[2] = function () { myFunc(a, b, 2) };
но на самом деле, если объектов много, то куда проще делать примерно так:
Код:
arr= []; // массив объектов
function func () {
   alert(this.custom_index);
}
for (var i= 0; i < arr.length; i++) {
   arr[i].custom_index= i;
   arr[i].handler_func= func;
}
....
// потом где-то делам вызов так:
arr[k].handler_func();
// или можно вообще handler_func не присваивать, а делать так:
func.call(arr[k]);
 

berkut

Новичок
в прототипе через bind() делается... надо посмотреть его кишки
 

dimagolov

Новичок
да что там смотреть? вызов bind (даже если ему передается i как параметр) образует свой локальный контекст и область видимости, поэтому замыкание, которое делается внутри вызова bind будет искать переменные из области видимости bind-а, а не из той, где i переменная цикла.
 
Сверху