在循环中使用闭包?

在面试过程中经常问到闭包,来判断你对js的熟悉程度,以及使用场景

闭包基本上是内部函数可以访问其范围之外的变量,闭包可用于实现隐私和函数工厂

大部分的案例是这样的,编写一个函数,该函数将遍历整数列表,并在延迟3秒后打印每个元素的索引

被错误的写成这样的代码:

const arrkkb = [1, 2, 7, 11];
for (var i = 0; i < arrkkb.length; i++) {
  setTimeout(function() {
    console.log('The index of this number is: ' + i);
  }, 3000);
}
复制代码

按照运行上面的代码 3秒延迟之后执行打印的结果输出为4个4 ,而不是期望的0,1,2,3

为了正确的解释这种的情况,为什么会在js中得出这样的结果,这正是面试官视图测试的内容,

解释如下:
setTimeout函数创建了一个可以访问其外部作用域的函数(闭包),该作用域是包含索引i的循环,经过3秒之后,执行该函数并打印出i的值,该值在循环结束时为4,因为它循环经过0,1,2,3,4并且循环最终停止在4,

实际上有很多方法来正确解释:

const arrkkb = [1, 2, 7, 11];
for (let i = 0; i < arrkkb.length; i++) {
 setTimeout(function() {
   console.log('The index of this number is: ' + i);
 }, 3000);
}
复制代码

解释二

const arrkkb = [1, 2, 7, 11];
for (var i = 0; i < arrkkb.length; i++) {
 setTimeout(function(i_l){
   return function () {
     console.log('The index of this number is: ' + i_local);
   }
 }(i), 3000)
}


复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享