为什么我的私人变量会被更改?

时间:2012-10-14 21:45:12

标签: javascript variables methods private

这里是小提琴:http://jsfiddle.net/Xh4GU/1 或代码:

function Vector()
{
    var v = new Array(123, 456, 789);

    this.getV = function()
    {
        return v;
    }
}

function Formulas()
{
    this.add = function(x, axis, units)
    {
        x[axis] += units;
    }
}

var vector = new Vector();
var formulas = new Formulas();

var v = vector.getV();
var vAdded = formulas.add(v, 0, 77)

document.write(v);

吐出:200,456,789

为什么v的第一个索引被改变了? 感谢

4 个答案:

答案 0 :(得分:2)

因为数组通过引用传递给formulas.add,所以传递的参数formulas.add是对私有数组v的引用,您对其进行的任何更改其内容将来仍然可见。

v是私有的这一事实在将v的引用分发给外部代码时不会保护其内容。它确实阻止外部代码为自己抓取v并将v与另一个数组交换,但可以修改数组本身(其值已更改)。

答案 1 :(得分:0)

因为你改变它是一个数组,你在公式中更改它。 jsfiddle

var vector = new Vector();
document.write(v.toString());  // 123,456,789
var formulas = new Formulas();

var v = vector.getV();
var vAdded = formulas.add(v, 0, 77).// v getting changed inside formulas.add.  
document.write(v); //200,456,789

答案 2 :(得分:0)

var vAdded = formulas.add(v, 0, 77)

你说要将数组的第一个索引(v[0])加77.为什么?私有变量vthis.getV返回。当你做了

var v = vector.getV();

它返回了对数组的引用。这有效地允许您与函数外部的数组进行交互。

答案 3 :(得分:0)

这种情况正在发生,因为您引用而不是复制v,请参阅我的演示以获得更明确的示例:http://jsfiddle.net/SO_AMK/hjtLd/如果您在生成后单击按钮您会看到结果是不同数组的数字。

但是,如果将数组移动到vector.getV()内,您将看到结果将始终为123,456,789。这是因为每次运行函数时都会重置v的值。

您还可以创建“真实”副本,如下所示:http://jsfiddle.net/SO_AMK/J8h4d/