这里是小提琴: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的第一个索引被改变了? 感谢
答案 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.为什么?私有变量v
由this.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/