LINUX.ORG.RU

История изменений

Исправление static_lab, (текущая версия) :

Допустим, нам необходимо передать какие-либо переменные в цикле в коллбэк:

for (var i = 0; i < 10; i++) {
    window.setTimeout(
        function() {
            console.log(i);
        },
        1000
    );
}

(В реальности это могло быть обращение по сети и т.п.)

Такой код будет работать неправильно, поскольку переменная свяжется по ссылке, то есть в момент вызова коллбэка цикл уже завершится, и i будет равно 10.

Одним из вариантов решения проблемы может быть использование bind (такое форматирование сделано специально для наглядности):

for (var i = 0; i < 10; i++) {
    window.setTimeout(
        (function(j) {
            console.log(j);
        }).bind(this, i),
        1000
    );
}

Это практически аналогично такому коду:

for (var i = 0; i < 10; i++) {
    window.setTimeout(
        (function(j) {
            return function() {
                console.log(j);
            };
        })(i),
        1000
    );
}

Можно видеть, что вариант с bind короче.

Исходная версия static_lab, :

Допустим, нам необходимо передать какие-либо переменные в цикле в коллбэк:

for (var i = 0; i < 10; i++) {
    window.setTimeout(
        function() {
            console.log(i);
        },
        1000
    );
}

(В реальности это могло быть обращение по сети и т.п.)

Такой код будет работать неправильно, поскольку переменная свяжется по ссылке, то есть в момент вызова коллбэка цикл уже завершится, и i будет равно 10.

Одним из вариантов решения проблемы может быть использование bind (такое форматирование сделано специально для наглядности):

for(var i = 0; i < 10; i++) {
    window.setTimeout(
        (function(j) {
            console.log(j);
        }).bind(this, i),
        1000
    );
}

Это практически аналогично такому коду:

for(var i = 0; i < 10; i++) {
    window.setTimeout(
        (function(j) {
            return function() {
                console.log(j);
            };
        })(i),
        1000
    );
}

Можно видеть, что вариант с bind короче.