下面是这个闭包面试题一直一知半解的,对于输出的结果我是这么理解的,每次循环的时候执行一遍立即执行函数,然后往匿名函数里传入一个形参i
,每次立即执行函数调用的时候产生的匿名函数都不是同一个,所以console.log
所引用的变量i
也不是同一个形参,所以每次定时器输出的都是当前循环时的i。
那是不是在每次for循环的过程中就产生了一个新的匿名函数呢,如果是这样的话就有另外一个问题了,function不是会声明提前吗,难道for循环真正执行之前已经提前声明了10个函数了?怎么从作用域或者内存的角度来解释为什么能得到这样的结果呢
function getNum() {
for (var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function() { console.log(i); }, 100 * i);
})(i);
}
}
//输出结果:0,1,2,3,4,5,6,7,8,9
for
里定义的匿名函数是个函数表达式,不是函数声明语句,不存在声明提升。结果没变。这是为啥呢?
再验证下:
验证后再看下Javascript块级域内的函数声明提升