2015-10-30 3 views
2

Я видел примеры закрытия, и я думал, что я их понимаю, пока я не решил сделать это:Почему этот пример закрытия работает некорректно?

var f = []; 
for (var i = 0; i < 2; i++) { 
    f[i] = function foo(a) { 
     var h = i; 
     function bar() { 
      console.log(h); 
     } 
     if (a == 1) 
      bar(); 
    } 
} 

for (var j = 0; j < 2; j++) { 
    console.log(f[j](1)); 
} 

Выход заключается в следующем:

2 
2 

Когда я думал, что это будет 0, 1 так Я создал внешнюю функцию foo, где я храню i в переменной h Может ли кто-нибудь объяснить, что здесь происходит и почему эти setTimeout примеры работают исправно?

+0

Вы не 'setTimeout' звонки? [Этот вопрос] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) сильно связан, возможно, с дубликатом. –

+5

Вы только присваиваете 'i'' 'h, когда функция фактически вызывается. В то время 'i' уже 2. – Yoshi

+0

@Yoshi Хорошо, теперь я понял. Было легко на самом деле. Спасибо! –

ответ

2

Для требуемого выхода обновления кода следующая

var f = []; 
for (var i = 0; i < 2; i++) { 
    f[i] = (function(i){ 
       return function foo(a) { 
       var h = i; 
       function bar() { 
        console.log(h); 
       } 
       if (a == 1) 
        bar(); 
      } 
     })(i); 
} 

for (var j = 0; j < 2; j++) { 
    console.log(f[j](1)); 
} 
Смежные вопросы