2014-02-13 182 views
2

這是我在一個較大的項目中遇到的問題的簡化,所以我希望它是有道理的。Javascript對象範圍

我有兩個對象:

FirstObj = { 
    data : [], 

    init : function() 
    { 
     for(var a = 0; a < 20; a++) 
     { 
      this.data[a] = 1; 
     } 
    } 
}; 


SecondObj = { 
    init : function() 
    { 
     var cell = FirstObj.data[0]; 
     cell = 0; 
    } 
}; 

我然後調用兩個init方法和記錄結果:

(function(){ 
    FirstObj.init(); 
    SecondObj.init(); 
    console.log(FirstObj.data); 
})() 

現在,我是假設 - 基於我在Actionscript中的基礎上 - 即日誌會顯示Array,其中第一項是0,其餘全部爲1,但0似乎並不堅持。

爲什麼0值的賦值在這裏沒有成功,但如果我直接在FirstObj.data[0] = 0處直接定位而不是cell = 0,那麼它的工作正常。

我猜這是一個範圍的事情,我可以圍繞它,但我想正確理解JS如何處理這些東西,尤其是當代碼集合到像這樣的對象(作爲一個旁道,這在人們的普遍看法中是一個很好的方法嗎?)。

感謝您的幫助。

回答

0

數字在JavaScript是一種叫primitive value types(旁邊字符串,布爾nullundefined)。

這意味着,當你做

var cell = FirstObj.data[0]; 

你傳遞FirstObj.data[0]而不是refernece它。

你在做什麼是這樣的:

var x = 5; 
var y = x; // y is now 5 
y = 4; // y is 4, x is still 5. 

當然,像FirstObj.data[0] = 0應該工作。

1

數組索引返回Javascript中的值,而不是引用。這意味着一旦data[0]被分配到cellcell的進一步修改將不會影響data[0]

指定數組本身會導致你要找的行爲:

SecondObj = { 
    init : function() 
    { 
     var cells = FirstObj.data; 
     cells[0] = 0; // Will also affect data[0]. 
    } 
};