2015-11-11 3 views
1

Я новичок в Javascript и пытаюсь перебрать массив внутри цикла for с setTimeout, это часть кода, поэтому по умолчанию у меня есть 100 мс. Я ожидаю, что результат будет 1,2,3, но вся его печать не определена 3 раза. если кто-то может помочь мне объяснить, почему это будет полезно.Переменная переменной Javascript с IIFE

var allCars=['Car1','Car2','Car3']; 
for(var i = 0; i < allCars.length; i++) 
{ 
    (function(temp){ 
    setTimeout(function(temp){ 
     console.log(allCars[temp]); 
    },100)})(i); 
} 
+0

'setTimeout' не проходят никаких аргументов в функции обратного вызова. Поскольку вы объявили обратный вызов с параметром 'temp',' temp' будет 'undefined'. Если вы ожидаете, что 'temp' будет ссылаться на внешний параметр вашего IIFE, как вы ожидали, что JavaScript будет знать, какой из них выбрать? –

ответ

2

setTimeout не проходит какого-либо параметра (если вы не укажете) его обратного вызова, но вы указываете один параметр с именем temp, который скрывает temp во внешней области.

var allCars=['Car1','Car2','Car3']; 
for(var i = 0; i < allCars.length; i++) 
{ 
    (function(temp){ 
    setTimeout(function(temp){ // This temp hides the temp on the line above 
     console.log(allCars[temp]); 
    },100)})(i); 
} 

Просто удалите параметр из обратного вызова, переданного setTimeout, чтобы внешний temp быть видимым.

2

Вот обновленный код, который даст правильный результат. Проблема вас возникли, когда вы передаете параметр в setTimeout здесь обновляются код

var allCars=['Car1','Car2','Car3']; 
for(var i = 0; i < allCars.length; i++) 
{ 
    (function(temp){ 
    setTimeout(function(){ 
     console.log(allCars[temp]); 
    },100)})(i); 
}