2

这是小提琴: 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

4 回答 4

2

因为数组是通过formulas.add引用传递的,所以传递的参数是formulas.add对私有数组的引用,因此v您对其内容所做的任何更改都将在未来保持可见。

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

于 2012-10-14T21:47:57.993 回答
0

因为你改变它 v 是一个数组,你在公式中改变它。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
于 2012-10-14T21:47:20.380 回答
0
var vAdded = formulas.add(v, 0, 77)

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

var v = vector.getV();

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

于 2012-10-14T21:47:43.240 回答
0

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

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

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

于 2012-10-14T22:00:35.643 回答