【问题标题】:Why are my private vars being changed?为什么我的私人变量被改变了?
【发布时间】:2012-10-04 21:48:07
【问题描述】:

这里是小提琴: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 的第一个索引被改变了? 谢谢

【问题讨论】:

  • 因为你所有的变量(v、全局vx参数)都引用了同一个数组对象?你希望add 做什么?

标签: javascript variables methods private


【解决方案1】:

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

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

【讨论】:

  • JavaScript 只有传值,即使这些值是对象。
  • 是的,JavaScript 中没有传递引用。碰巧是对象引用的值按值传递:-)
  • @A.M.K: 不。请理解pass by reference 究竟是什么。 JavaScript 只有传值;无论你在函数内部做什么,外部的 variable 都不会改变它的值。当然,两者都可能引用同一个对象,并且对属性的更改将被“反映”。 JavaScript 为对象执行call-by-sharing
  • @A.M.K 您发布的链接也很古老,并且充满了可疑信息。
  • @Bergi:我修正了措辞,虽然原版在技术上并不准确,恕我直言,但它确实传达了这样一个观点,即您最终是在对原始数组的引用进行操作。
【解决方案2】:

因为您更改它 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

【讨论】:

    【解决方案3】:
    var vAdded = formulas.add(v, 0, 77)
    

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

    var v = vector.getV();
    

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-11-12
        • 1970-01-01
        • 2021-10-31
        • 2016-06-24
        • 1970-01-01
        • 2021-08-23
        • 1970-01-01
        • 2013-11-01
        • 2014-03-08
        相关资源
        最近更新 更多