var arr = [];
for (var i=0;i<5;i++) {
arr[i] = function() {console.log(i)}
}
arr[0]();
arr[1]();
arr[2]();
arr[3]();
arr[4]();
// 5 5 5 5 5
// 另一个
var arr = [];
for (var i=0;i<5;i++) {
!function(i) {
arr[i] = function() {console.log(i)}
}(i);
}
arr[0]();
arr[1]();
arr[2]();
arr[3]();
arr[4]();
// 0 1 2 3 4
第一个实例:当执行数组内匿名函数时,里面的i指向的是已经循环完毕的i,都会显示5
第二个实例:当加入一个立即执行函数后,每次循环,执行一次自调用函数,i将作为实参传入函数内,又被数组函数(这个函数是闭包了吧)内的i引用,当自调用结束后,外函数作用域链被销毁,但是由于闭包函数引用i值,它的变量对象保存下来,直至数组函数被调用时,所有的函数内作用域被销毁(变量对象一同销毁)
GCT1015
相关分类