1. ホーム
  2. javascript

[解決済み] JavaScriptは参照渡しですか?[重複あり]

2022-03-21 05:33:23

質問

JavaScriptは参照渡しなのか、値渡しなのか?

の例です。 JavaScriptです。良いところ . について非常に混乱しています。 my 矩形関数のパラメータです。実際は undefined で、関数内部で再定義されます。元の参照はありません。もし私が関数のパラメータからそれを取り除くと、領域内の関数はそれにアクセスすることができません。

クロージャなのでしょうか?しかし、関数は返されない。

var shape = function (config) {
    var that = {};
    that.name = config.name || "";
    that.area = function () {
        return 0;
    };
    return that;
};

var rectangle = function (config, my) {
    my = my || {};
    my.l = config.length || 1;
    my.w = config.width || 1;
    var that = shape(config);
    that.area = function () {
        return my.l * my.w;
    };
    return that;
};

myShape = shape({
    name: "Unhnown"
});

myRec = rectangle({
    name: "Rectangle",
    length: 4,
    width: 6
});

console.log(myShape.name + " area is " + myShape.area() + " " + myRec.name + " area is " + myRec.area());

解決方法は?

プリミティブは値渡し、オブジェクトは"参照のコピー"で渡されます。

具体的には、オブジェクト(または配列)を渡すと、そのオブジェクトへの参照を(見えないように)渡していることになります。 内容 しかし、参照を上書きしようとしても、呼び出し元が保持する参照のコピーには影響しません - つまり、参照自体は値で渡されます。

function replace(ref) {
    ref = {};           // this code does _not_ affect the object passed
}

function update(ref) {
    ref.key = 'newvalue';  // this code _does_ affect the _contents_ of the object
}

var a = { key: 'value' };
replace(a);  // a still has its original value - it's unmodfied
update(a);   // the _contents_ of 'a' are changed