2015-05-23 3 views
3

У меня есть функция внизу, которая всегда дает мне результат 5. Я вижу, что функция inner выполняется в global context, поэтому результат равен 5.Функция всегда приводит к тому же номеру

Я попытался обернуть весь цикл внутри замыкания, так что он создает новую область, но она не удалась.

var myAlerts = []; 

for (var i = 0; i < 5; i++) { 
    myAlerts.push(
     function inner() { 
      alert(i); 
     } 
    ); 
} 

myAlerts[0](); // 5 
myAlerts[1](); // 5 
myAlerts[2](); // 5 
myAlerts[3](); // 5 
myAlerts[4](); // 5 

Может ли кто-нибудь сказать мне, как исправить эту проблему?

+1

на стороне отметить его плохую идею, чтобы определить функцию внутри цикла. Это означает, что функция должна создаваться для каждого цикла. – Craicerjack

+0

Что происходит в вашем коде, так это то, что вы нажимаете на функцию 'inner()' в свой массив. Поэтому для каждого шага в вашем цикле вы вызываете функцию под названием 'inner()', которая принимает значение 'i' в массив. Проблема здесь в том, что когда вы обращаетесь к значениям, вызываемым этой функцией 'inner()' и передавая ей значение 'i'. Учитывая, что последнее значение i в вашем коде было 5, вы вызываете 'inner (5)' для каждого элемента в 'myAlerts'. – Craicerjack

ответ

3

Try укупорочные:

for (var i = 0; i < 5; i++) { 
    (function(i){ 
     myAlerts.push(
     function inner() { 
      alert(i); 
     } 
    ); 
    })(i); 
} 
1

Обертывания функции закрытия работы:

var myAlerts = []; 

for (var i = 0; i < 5; i++) { 
    myAlerts.push((function(i) { 
    return function inner() { 
     alert(i); 
    } 
    })(i)); 
} 
Смежные вопросы