JavaScript 传递引用还是传值?

475

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

以下是来自JavaScript: The Good Parts的一个例子。我对rectangle函数中的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());
13个回答

2

我在人们试图演示时看不到按引用传递的例子,我只看到按值传递

对于持有对象引用的变量,引用是这些变量的,因此传递的是引用,即按值传递

就像这样的语句,

Original Answer

最初的回答

var a = {
  b: "foo",
  c: "bar"
};

'a'的值并不是对象,而是(目前仅有的)对它的引用。换句话说,对象不在变量a中——对它的引用在其中。我认为这对于主要只熟悉JavaScript的程序员似乎很困难。但对于也了解Java、C#和C等其他语言的人来说很容易理解。


2

对象始终按引用传递,基本类型按值传递。只需将该参数保持在对象的相同地址即可。

以下是一些代码,以说明我的意思(请在JavaScript沙盒中尝试,例如https://js.do/)。

不幸的是,您不能仅保留参数的地址;您还保留了所有原始成员值。

a = { key: 'bevmo' };
testRetain(a);
document.write(' after function ');
document.write(a.key);


function testRetain (b)
{
    document.write(' arg0 is ');
    document.write(arguments[0].key);
    b.key = 'passed by reference';
    var retain = b; // Retaining the original address of the parameter

    // Address of left set to address of right, changes address of parameter
    b = {key: 'vons'}; // Right is a new object with a new address
    document.write(' arg0 is ');
    document.write(arguments[0].key);

    // Now retrieve the original address of the parameter for pass by reference
    b = retain;
    document.write(' arg0 is ');
    document.write(arguments[0].key);
}

结果:

arg0 是 bevmo,arg0 是 vons,arg0 在函数传递引用后被引用传递


1

原始类型是按值传递的。但是如果您只需要读取原始类型的值(并且在调用函数时不知道该值),则可以传递一个函数,在您需要该值的时候检索它。

function test(value) {
  console.log('retrieve value');
  console.log(value());
}

// call the function like this
var value = 1;
test(() => value);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接