为什么这段代码返回undefined 4次而不是数组值?

时间:2015-03-03 11:37:52

标签: javascript

这是来自Avaylo Gerchev的博客文章的一个例子,其中涉及IIFE。下面的代码块返回4个重复的' undefined'设计回应:

function printFruits(fruits){
  for (var i = 0; i < fruits.length; i++) {
   setTimeout( function(){
      console.log( fruits[i] );
    }, i * 1000 );
  }
}

printFruits(["Lemon", "Orange", "Mango", "Banana"]);

Avaylo然后展示了如何产生(对我来说)第一个代码块的预期输出(它输出数组的值):

function printFruits(fruits){
  for (var i = 0; i < fruits.length; i++) {
    (function(){
      var current = i;                    // define new variable that will hold the current value of "i"
      setTimeout( function(){
        console.log( fruits[current] );   // this time the value of "current" will be different for each iteration
      }, current * 1000 );
    })();
  }
}

printFruits(["Lemon", "Orange", "Mango", "Banana"]);

据我所知,IIFE创造了一个新范围。我不明白的是第一个代码块没有产生(再次,对我来说)返回数组中值的预期输出的原因。我现在已经盯着这几天,因此我得出结论,我的javascript知识缺少一些基本的东西。

感谢您的任何见解!

1 个答案:

答案 0 :(得分:0)

在第一个代码块中,闭包不能访问变量“i”,因为setTimeout只定义要运行的代码,但实际上不会在定义上运行它,只是稍后。

在那里有闭包并立即运行它(在末尾带有括号())是一种在每次迭代中保存“i”值的方法,这样当setTimeout运行时,它就可以访问它。