使用IIFE的Javascript变量范围

时间:2015-11-11 21:18:02

标签: javascript iife

我是Javascript的新手,并尝试使用setTimeout在for循环内循环数组,这是代码的一部分,所以默认情况下我有100毫秒。 我期望输出为1,2,3但是它的所有打印都是未定义的3次。 如果有人可以帮我解释为什么会有所帮助。

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

2 个答案:

答案 0 :(得分: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可见。

答案 1 :(得分: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);
}