Как создать замыкание в цикле и сохранить его в переменной для последующего выполнения - PullRequest
2 голосов
/ 09 апреля 2011

См. Код ниже. Я пытался раздеть его до гола.

У меня есть массив _queue. Я хочу повторить 10 раз. На каждой итерации я хочу создать функцию, имеющую правильно заданную ссылку для j (то есть j = 0 на первой итерации, j = 1 на второй итерации и т. Д.)

Я хочу сохранить эту функцию в переменной f, а затем добавить f в массив _queue, чтобы я мог вызвать ее позже.

Проблема, конечно, в том, что на каждой итерации первого цикла вместо сохранения замыкания в f он сразу же выполняет замыкание.

У меня такой вопрос: как сохранить функцию с соответствующей переменной j, чтобы я мог добавить ее в массив _queue?

    _queue = [];

    for (j = 0; j < 10; j++) {

        var f =
          (function (index) {
            alert(index);
        })(j);                    //code is executed here instead of stored in the f variable

        _queue.push(f);  //Add f 

    }

    for (k = 0; k < _queue.length; k++){
        _queue[k].call();
    }

1 Ответ

9 голосов
/ 09 апреля 2011

Использование немедленной функции (или вообще использование функции) для введения новой области является правильным. Но вы должны вернуть функцию из непосредственной функции:

var f = (function (index) {
    return function() {
       alert(index);
    };
}(j));     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...