js闭包问题

以下为一个简单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);

题目来源及自己的思路

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

你期待的结果是什么?实际看到的错误信息又是什么?

阅读 1.7k
2 个回答

不是闭包引起的,是因为b是对象,是引用类型变量,你把b的值放进a数组,其实放进去的只是一个内存地址,并不是b这个值本身,你循环每次都在改变b的值,也会对应的改变已经添加到a数组里面的b的值,所以最后得到的a的值,里面的b全都是一样的。想到你预期结果,就像你后面说的那样,循环体里面重新申明一个b。
顺便说一句,循环可是不会产生闭包的,闭包只存在于函数体里面。

这个跟闭包没有关系吧?
第一个例子,
先对对象b的x属性赋值,后续的循环都只是修改x属性,最终x属性是4,但是b对象始终只有一个实例对象。
而a[i] = b;不过是将a数组中的每一个值指向b数组的实例而已。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题