第一个不是闭包,是匿名函数。。。
因为隔了一秒后,循环已经执行完了,你去掉延时执行就能看到每步打印的数据了;
第二个也不是闭包。。。
因为js的执行环境是先初始化变量,再按顺序执行,很明显a函数执行的时候,循环已经结束了,所以获得的值也就是3
第三个是返回的最后一个执行完的b函数,而b函数里边的i是索引的最后一个i,所以执行就是一个3
对于你补充的3的答案,还是那句话,b函数获取到的是最后的i了
建议楼主去了解下js的作用域链方面的知识
1. 因为执行时是异步的,当它执行时,去取变量 i 的值,这时 i = 10. 所以每次都是 10. setTimeout 后延迟 1 秒执行,1 秒内 for 循环肯定执行完了,所以 i = 10. 要注册异步执行时,创建 closure 时只给出变量符号名,执行时才去取这个变量的值,为了能把当时的值复制过去,我们需要创建一个对象将这个值复制一份。
2. 因为 for 循环里面把 a 这个函数重新定义了 3 遍,你只能使用最一次的定义。
3. 问题3参考问题2,一样的道理,重新定义过 3 次,只能使用最后一次的定义。
每个对象都有一个作用域链,作用域链上有从当前对象作用域到最外层也就是window的作用域。
依次向下访问,而作用域链上保存的是整个变量对象而不是某个特殊的变量。所以你只能访问到你外层对象的最终值,也就是该对象已经执行完了以后的值。如果想获得每一个值,可以用匿名函数
for(var i=0;i<3;i++){
(function(){
function b() {
alert(i);
}
})(i);
}
每次循环把值传给匿名函数就行了,这种情况很常见。
javascript高级程序设计第三版 P181 讲过
楼主给分