以下为一个简单for循环,结果输出全部为x=4;
var a=[],b={};
for(var i=0;i<5;i++){
b.x=i;
a[i]=b;
}
console.log(a);
修改后代码如下,则输出的结果是预期的结果,请问各位大神,这是闭包问题引起的吗?需要把对象b设置在for循环之外如何实现?
var a=[];
for(var i=0;i<5;i++){
var b={};
b.x=i;
a[i]=b;
}
console.log(a);
题目来源及自己的思路
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
不是闭包引起的,是因为b是对象,是引用类型变量,你把b的值放进a数组,其实放进去的只是一个内存地址,并不是b这个值本身,你循环每次都在改变b的值,也会对应的改变已经添加到a数组里面的b的值,所以最后得到的a的值,里面的b全都是一样的。想到你预期结果,就像你后面说的那样,循环体里面重新申明一个b。
顺便说一句,循环可是不会产生闭包的,闭包只存在于函数体里面。