这是来自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知识缺少一些基本的东西。
感谢您的任何见解!
答案 0 :(得分:0)
在第一个代码块中,闭包不能访问变量“i”,因为setTimeout只定义要运行的代码,但实际上不会在定义上运行它,只是稍后。
在那里有闭包并立即运行它(在末尾带有括号())是一种在每次迭代中保存“i”值的方法,这样当setTimeout运行时,它就可以访问它。