Javascript对象范围

时间:2014-02-13 12:50:49

标签: 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值的分配在此处不成功,但如果cell = 0我直接定位到FirstObj.data[0] = 0,则效果正常。

我猜这是一个范围问题,我可以解决它,但我正在努力正确理解JS实际上如何处理这些东西,特别是在将代码集中到像这样的对象时(另外,是这是人们普遍看法的好方法吗?)。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

数组索引返回Javascript中的值,而不是引用。这意味着,data[0]分配cell后,对cell的进一步修改不会影响data[0]

分配数组本身会导致您正在寻找的行为:

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

答案 1 :(得分:0)

JavaScript中的数字称为primitive value types(包括字符串,布尔值nullundefined)。

这意味着,当你这样做时

var cell = FirstObj.data[0];

您正在传递FirstObj.data[0]中的,而不是参考它。

你在做什么就像:

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

当然,像FirstObj.data[0] = 0这样的东西应该有效。