注意!!!千万别掉进这个面试题的陷阱里

134 阅读2分钟

题目

给出下列的代码,说出运行结果:

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吧,注意哦,这个答案是错误的,正确答案是:

image.png

如果你的答案是正确的话那就太好啦!!!

解析

是因为执行完第一个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]();
}

image.png

收获

如果对作用域的知识点不太清晰的话,可以前往juejin.cn/post/736172… 去看看哦~

希望这篇文章的分享能帮助到你,手动握手

image.png