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を防ぎますが、配列自体は変更できます (値が変更されます)。vv

于 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で追加すると言っています。なぜですか? プライベート変数vは によって返されthis.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 に答える