【问题标题】:JavaScript function expression assigned to a variable (pass by reference or value?) [duplicate]分配给变量的JavaScript函数表达式(通过引用或值传递?)[重复]
【发布时间】:2016-12-20 14:22:36
【问题描述】:

我对以下代码有疑问。我认为在 JS 中分配给变量的数据类型原语是通过值传递的,而对象是通过引用传递的。如果函数是JS中的对象,我认为应该是引用传递,但是下面的两个代码表现得像值传递:

代码 1

var x = function hello(){ console.log("hello")};

console.log(x);

var y = x;

console.log(y);

x = function bye(){console.log("bye")};

console.log(x);

console.log(y);

输出

[Function: hello]
[Function: hello]
[Function: bye]
[Function: hello]

代码 2

在这种情况下,我将一个方法分配给了一个全局变量,并且行为是相同的:

var x = {name:"Max",
        action: function one(){console.log("one")}
}

var y = x.action;

console.log(y);

x.action = function two(){console.log("two")};

console.log(x.action);

console.log(y);

输出

[Function: one]
[Function: two]
[Function: one]

我非常感谢对此的任何见解和解释。

【问题讨论】:

  • 您正在重新分配变量。不通过引用修改它们。
  • JS 没有通过引用。始终按值传递,但该值可以是引用。
  • 感谢您的回答 Niet。在代码 1 中,如何修改通过引用分配给变量 x 的函数“hello”,而不是重新分配它?

标签: javascript pass-by-reference pass-by-value


【解决方案1】:

从这方面来说,JavaScript 是按值传递的。

将变量 X 赋值给变量 Y 会将 X 的值放入 Y 中,即使 X 的值是对对象的引用。

当您修改对象中更深层次的属性时,您可以看到您正在寻找的“通过引用”性质:

var x = { foo: () => "bar"; }
var y = x;

x.foo = () => "baz";

y.foo(); // "baz", and not "bar".

如果我将x 设置为{ foo: () => "baz" }y.foo() 仍然会导致"bar",因为我没有修改原始对象,我将其替换为另一个。


澄清一下,JavaScript 没有var x = &y; 或类似 PHP 的东西。

【讨论】:

  • 感谢您的回答马达拉。我知道您发布的示例。现在,如何通过引用修改代码 1 中的函数 hello?
【解决方案2】:

在此代码中,y 将不再是 x 的引用,x 被重新分配了一个新功能。如果您修改了x 中的属性,那么y 仍将是x 的引用。

JS 中的每个对象都会发生同样的情况。

【讨论】:

    【解决方案3】:

    您只是将函数分配给变量,这段代码没有什么棘手的问题,它可以正常工作,请随时提出更多问题。

    【讨论】:

      【解决方案4】:

      在这里通过引用/值传递无关紧要,因为不涉及传递。

      这些变量包含的值是对函数的引用。我认为您所期望的是 yx 在分配后以某种方式链接,但分配只会更改 y 所指的功能,而与 x 没有进一步关联。

      首先x 保存对hello 的引用,然后将y 设置为保存对hello 的引用,然后将x 设置为包含对bye 的引用。所以最后,x 包含对 bye 的引用,y 包含对 hello 的引用。

      这与以下基本相同:

      var x = "hello";
      var y = x;
      x = "bye";
      
      console.log(x);
      console.log(y);
      

      【讨论】:

        猜你喜欢
        • 2015-03-28
        • 1970-01-01
        • 2011-09-01
        • 2018-09-18
        • 1970-01-01
        • 2010-10-04
        • 2017-01-27
        • 2016-06-19
        • 2017-03-27
        相关资源
        最近更新 更多