鍍金池/ 問(wèn)答/HTML/ js閉包問(wèn)題

js閉包問(wèn)題

以下為一個(gè)簡(jiǎn)單for循環(huán),結(jié)果輸出全部為x=4;

var a=[],b={};
for(var i=0;i<5;i++){
  b.x=i;
  a[i]=b;  
}
console.log(a);

修改后代碼如下,則輸出的結(jié)果是預(yù)期的結(jié)果,請(qǐng)問(wèn)各位大神,這是閉包問(wèn)題引起的嗎?需要把對(duì)象b設(shè)置在for循環(huán)之外如何實(shí)現(xiàn)?

var a=[];
for(var i=0;i<5;i++){ 
 var b={};
  b.x=i;
  a[i]=b;  
}
console.log(a);

題目來(lái)源及自己的思路

相關(guān)代碼

// 請(qǐng)把代碼文本粘貼到下方(請(qǐng)勿用圖片代替代碼)

你期待的結(jié)果是什么?實(shí)際看到的錯(cuò)誤信息又是什么?

回答
編輯回答
吃藕丑

不是閉包引起的,是因?yàn)閎是對(duì)象,是引用類型變量,你把b的值放進(jìn)a數(shù)組,其實(shí)放進(jìn)去的只是一個(gè)內(nèi)存地址,并不是b這個(gè)值本身,你循環(huán)每次都在改變b的值,也會(huì)對(duì)應(yīng)的改變已經(jīng)添加到a數(shù)組里面的b的值,所以最后得到的a的值,里面的b全都是一樣的。想到你預(yù)期結(jié)果,就像你后面說(shuō)的那樣,循環(huán)體里面重新申明一個(gè)b。
順便說(shuō)一句,循環(huán)可是不會(huì)產(chǎn)生閉包的,閉包只存在于函數(shù)體里面。

2018年8月6日 08:42
編輯回答
初念

這個(gè)跟閉包沒(méi)有關(guān)系吧?
第一個(gè)例子,
先對(duì)對(duì)象b的x屬性賦值,后續(xù)的循環(huán)都只是修改x屬性,最終x屬性是4,但是b對(duì)象始終只有一個(gè)實(shí)例對(duì)象。
而a[i] = b;不過(guò)是將a數(shù)組中的每一個(gè)值指向b數(shù)組的實(shí)例而已。

2018年8月26日 16:54