Я разработчик C # и привык к тому, как замыкания работают в C #.
В настоящее время я должен работать с анонимными функциями JavaScript и столкнуться с проблемой следующего фрагмента:
function ClosureTest() {
var funcArray = new Array();
var i = 0;
while (i < 2) {
var contextCopy = i;
funcArray[i] = function() { alert(contextCopy); return false; };
i++;
}
funcArray[0]();
funcArray[1]();
}
Я ожидаю, что первый funcArray()
вызов скажет 0
, а второй скажет 1
. Тем не менее, они оба говорят 1
. Как это возможно?
Написав var contextCopy = i
, я удостоверяюсь, что создаю копию переменной i
. Затем в каждой итерации цикла я создаю совершенно новый указатель на функцию. Каждая функция ссылается на свою собственную копию i
, которая является contextCopy
. Однако обе созданные функции по какой-то причине ссылаются на одну и ту же переменную contextCopy
.
Как это работает в JavaScript?