JavaScript 是否通过引用传递?

JavaScript 是传递引用还是传递值?

下面是一个来自 JavaScript 的例子:The Good Parts。我对矩形函数的参数感到非常困惑。它实际上是在函数内部重新定义的。没有原始参考。如果我从函数参数中删除它,则内部区域函数无法访问它。myundefined

这是一个关闭吗?但不返回任何函数。

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());

答案 1

基元按值传递,对象按“引用副本”传递。

具体来说,当您传递一个对象(或数组)时,您正在(无形地)传递对该对象的引用,并且可以修改该对象的内容,但是如果您尝试覆盖引用,则不会影响调用方持有的引用的副本 - 即引用本身按值传递:

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

答案 2

可以这样想:

每当您在 ECMAscript 中创建一个对象时,这个对象都是在一个神秘的 ECMAscript 通用位置形成的,没有人能够获得它。你得到的只是在这个神秘的地方对那个物体的引用

var obj = { };

甚至只是对对象的引用(它位于那个特别美妙的地方),因此,您只能传递此引用。实际上,任何访问obj的代码段都将修改远方的对象。obj