校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > js语言和框架 > 闭包相关
题目

分析输出是什么

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。

C 0条回复 评论

帖子还没人回复快来抢沙发