1.题目:
function test(){
var arr = []
for(var i = 0; i < 10; ++i)
arr[i] = function (){
console.log(i)
}
retunr arr
}
var a = test()
for(var j = 0; j < 10; ++j)
a[j]()
上面这个问题,输出的全部都是10
解释:
1.只要在当前函数内部返回了函数,就会产生闭包,当前函数的作用域变量就不会释放
2.函数只有才执行的时候才会将引用变成具体的值,其他状态只存当前变量的引用
在对数组的元素赋值过程中,由于是立即执行的,所以数组索引的i会被立即替换成真实值,也就是1、2、…
但是对于每个console的i,由于未立即执行,所以会存在i的引用
在函数结束返回arr时,i的值是10(无论是不是var来声明的,因为存在GO里面和存在AO里面具有同样的效果),然后打印过程中打印的i还是test函数作用域(如果未用var声明,则是GO),所以打印的都是10
变种:
第一种:函数自调用
function test(){
var arr = []
for(var i = 0; i < 10; ++i)
(function (j){
arr[j] = function (){
console.log(j)
}
})(i)---->函数自调用
retunr arr
}
var a = test()
for(var j = 0; j < 10; ++j)
a[j]()
第二种:使用let代替var来声明i
function test(){
var arr = []
for(leti = 0; i < 10; ++i)
arr[i] = function (){
console.log(i)
}
retunr arr
}
var a = test()
for(var j = 0; j < 10; ++j)
a[j]()