看到一个面试题,题目是这样的:
function test(){
var arr = [];
for(var i =0;i<10;i++){
arr[i] = function(){
document.write(i + " ")
}
}
return arr
}
var myArr = test()
for(var j =0;j<10;j++){
myArr[j]()
}
问输出的结果是多少: 结果 10个10
分析一下这段程序,return arr,arr每一项赋值了函数,然后抛出,形成闭包,然后再二次循环这个数组,循环10,myArr其实就是arr,所以也就是循环这个arr的每一项,所以变成了循环arr的每一个函数然后执行,那么现在就是要分析这个arr每一项是什么东西.
再来看, i 循环里面,当i = 0时,输出0,i=1时,输出1,是不是,那么我arr数组的每一项就是一个从0-9的数组,是不是? 假如我们这样想的话, 就进入了这个题的陷阱了. 这道题它其实是类似于一个重复声明的过程(我理解的),因为函数没有执行,所以每一项就都会重复赋值,意思就是 i=0时,赋值一个函数表达式,i=1时,赋值一个函数表达式,最后到i=10不符合,但是输出打印的是i,所以最后函数表达式就是打印10,或者可以这样理解,函数是一段功能,在这里就是打印i,所以最后结果赋了值.
那么再问一个问题,假如我想输出0-9呢,在这个基础上应该怎么进行修改呢?
function test(){
var arr = [];
for(var i =0;i<10;i++){
( function(j){
arr[j] = function(){
document.write(j + " ")
}
}(i))
}
return arr
}
var myArr = test()
for(var j =0;j<10;j++){
myArr[j]()
}
这样,用立即执行函数包裹住里面那部分,每次循环就立即执行,就可以得到正确的结果了.