Я разработчик 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
-переменной. Затем на каждой итерации while я создаю совершенно новый указатель на функцию. Каждая функция ссылается на свою собственную копию i
, которая называется contextCopy
. Однако обе созданные функции по какой-то причине ссылаются на одну и ту же contextCopy
-переменную.
Как это работает в JavaScript?