JavaScript的for循环使用匿名函数顺次输出i,然而全部输出i的估计值
原创首先, 博主首先分享了一段 实施失败代码
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 了 版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
上一篇:死拼36个JS抄写题(转载)版权声明 下一篇:JS字段内容每3个逗号分成一个变量
itfan123



