2016-09-05 4 views
0

У меня есть код на JavaScript.Общие сведения о области возможностей

var a = []; 

for (var i = 0; i < 5; i++) { 
    a[i] = function() { 
     alert(i); 
    }; 
} 

a[2](); 

Если я призываю a[2]() я ожидаю увидеть сообщение с 2, но вместо этого я вижу 5.

Чтобы это исправить, я могу переписать так:

for (var i = 0; i < 5; i++) { 
    (function (v) { 
     a[i] = function() { 
      alert(v); 
     } 
    })(i) 
} 

Но я не могу понять, как это работает. Итак, зачем мне сворачивать код функции на закрытие?

+3

Потому что, в отличие от других языков, * не существует неявная область в 'for' заявления в JS. * Анонимные функции, с другой стороны, имеют свои собственные рамки и захватить внешние местные жители , поэтому обертывание тела цикла внутри функции и вызов ее сразу же решает проблему. –

+0

Заметим также, что в этом случае * i * является глобальным. – RobG

+0

@ RobG, внешний вид. Мы не знаем, что это такое - это может быть глобальная область действия, или внутри функции, или даже другое закрытие. –

ответ

-1

Функция самозапуска с закрытием - хороший способ создания области.

var a = []; 
 

 
for (var i = 0; i < 5; i++) { 
 
    a[i] = (function() { 
 
     var j = i; 
 
     return function() { 
 
      alert(j); 
 
     } 
 
    }(i)); 
 
} 
 

 
a[2]();

Смежные вопросы