JavaScript的for循环使用匿名函数顺次输出i,然而全部输出i的估计值

原创
小哥 3年前 (2022-11-16) 阅读数 9 #大杂烩

首先, 博主首先分享了一段 实施失败代码

var a=[];
for(var i = 0;i<10;i++){
   var q = i;
   a[i]=function(){console.log(q)}
}
a[0]() // 无论[] 什么是输出10

由于上述问题, 这位博主陷入了沉思,然后在一篇文章中受到启发:https://blog.csdn.net/kai\_l/article/details/50913505

其中,到期for循环不是函数体,因此for循环中定义的变量q和i是作用域for循环所在的函数体,以及a同级,
i++ 它不是重新定义变量,只是重复赋值,最终循环结束,i = 10
由于function(){console.log(q)} 它不会立即执行,所以这里q一直都是存储的内存引用,最终都是。a i 都是输出 9
这个问题是,循环结构会给你带来块级范围的误解。for使用循环头。var声明的变量是单个声明的变量绑定(单个存储空间)。在循环期间var声明的i变量随周期变化。

我画了一张图来帮助理解, 图片来自 https://segmentfault.com/a/1190000020026378

这里的博客现在知道有两种解决方案, 当然,可能存在错误, 如果是这样,我希望你能指出。

第一种

讲for在循环条件下var声明变为let声明(ES6)

var a=[];
for(let i = 0;i<10;i++){
   let q = i;
   a[i]=function(){console.log(q)}
}
a[6]() // 打印 6

第二种

使用立即执行函数

var a = [];
for(var i=0; i<10; i++){
  (function(j){  
    a[j] = function(){
    console.log(j);
  }
})(i);
}
a[2](); // 以这种方式打印的是 2 了
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除