题目
分析输出是什么
function test (){
var num = [];
var i;
for (i = 0; i < 10; i++) {
num[i] = function () {
console.log(i);
}
}
return num[9];
}
test()() // 输出什么?
解答
10
解析:这道题中首先执行test(),这个函数中进行了十次循环,每次循环都往数组num中新增一个function(这个function这里还没有执行,只是把函数的定义作为数组元素扔进去),最后返回下标为9的这个function。
所以,这里通过使用函数作为返回值的形式,形成了一个闭包。接着,test()()执行的是nums[9]这个function,也就是for循环中的这个function,把他拎出来:
function () {
console.log(i)
}
这个函数要打印i的值,但是这个函数中本身并没有定义i这个变量,所以变量i是一个自由变量。自由变量的查找,是要到函数定义的地方,沿着作用域链向上级查找(这一点在搞懂JavaScript的作用域、作用域链、闭包这篇文章中讲过)。
于是,就找到了test()这个函数的作用域。这个作用域中定义了变量i。当我执行打印i的操作时,for循环早就已经执行完毕了,i的值已经变成了10,所以此时找到的i,它的值就是10。所以,这道题的输出结果就是10。
帖子还没人回复快来抢沙发