2014-02-13 135 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]. 
    } 
};