题目
给出下列的代码,说出运行结果:
var arr = [];
for (var i = 0; i < 10; i++) {
arr[i] = function() {
console.log(i);
}
}
for (var j = 0; j < arr.length; j++) {
arr[j]();
}
分析
如果认为输出的结果是0,1,2,3,4,5,6,7,8,9吧,注意哦,这个答案是错误的,正确答案是:
如果你的答案是正确的话那就太好啦!!!
解析:
是因为执行完第一个for循环后全局内的i=10,然后再执行第二个循环,那么这个时候就执行a[j]函数,先在该函数内查找是否有i,有则输出,没有则去该函数的词法作用域找,因为该函数时声明在全局的,这个时候就去全局查找,此时i=10,所以得到输出的结果。
那么这个时候面试官就要开始刁难你了,让你小改变代码来实现输出0,1,2,3,4,5,6,7,8,9
我们要实现面试官想要的效果,那么这个时候我们就应该思考,如果我们让arr[j]函数的词法作用域变成for循环,就可以实现输出0到9了,怎样才能实现这个效果呢? 在之前的文章有分享过关于块级作用域的知识点(如果不太了解或对这个知识点有点模糊了可以前往juejin.cn/post/736172… 去看看) ,那么这个时候就思考怎么才能让for循环形成一个块级作用域呢?
---let/const + {}会形成块级作用域。
var arr = [];
for (let i = 0; i < 10; i++) {
arr[i] = function() {
console.log(i);
}
}
for (var j = 0; j < arr.length; j++) {
arr[j]();
}
收获
如果对作用域的知识点不太清晰的话,可以前往juejin.cn/post/736172… 去看看哦~
希望这篇文章的分享能帮助到你,手动握手