Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分配给变量的JavaScript函数表达式(通过引用或值传递?)_Javascript_Pass By Reference_Pass By Value - Fatal编程技术网

分配给变量的JavaScript函数表达式(通过引用或值传递?)

分配给变量的JavaScript函数表达式(通过引用或值传递?),javascript,pass-by-reference,pass-by-value,Javascript,Pass By Reference,Pass By Value,我对以下代码有疑问。我认为分配给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);

我对以下代码有疑问。我认为分配给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]
[Function: one]
[Function: two]
[Function: one]
代码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: hello]
[Function: hello]
[Function: bye]
[Function: hello]
[Function: one]
[Function: two]
[Function: one]

我真的很感激任何关于这一点的见解和解释

在此代码中
y
将不再是
x
的参考,之后,
x
将重新分配一个新功能。如果在
x
中修改属性,
y
仍将是
x
的引用


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

在此代码中,
y
不会作为
x
的引用,稍后,
x
会被重新分配一个新函数。如果在
x
中修改属性,
y
仍将是
x
的引用


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

您只是简单地将函数分配给变量,这段代码中没有什么棘手的事情,它正在按它应该的方式工作,请随意询问更多的问题。

您只是简单地将函数分配给变量,这段代码中没有任何棘手的事情,它正在按它应该的方式工作,请随意提出更多问题。

从这一点上讲,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的东西。

从这个角度来看,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中的内容。

这里,按引用传递/值并不重要,因为不涉及传递

这些变量包含的值是对函数的引用。我认为您所期望的是
y
x
在赋值后以某种方式链接,但赋值只会更改
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);

通过引用/值传递在这里并不重要,因为不涉及传递

这些变量包含的值是对函数的引用。我认为您所期望的是
y
x
在赋值后以某种方式链接,但赋值只会更改
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);

您正在重新分配变量。不按引用修改它们。JS没有按引用传递。始终按值传递,但该值可以作为参考。感谢您的回答Niet。在代码1中,如何修改通过引用分配给变量x的函数“hello”,而不是重新分配它?您正在重新分配变量。不按引用修改它们。JS没有按引用传递。始终按值传递,但该值可以作为参考。感谢您的回答Niet。在代码1中,我如何修改通过引用分配给变量x的函数“hello”,而不是重新分配它?谢谢你的回答,Madara。我知道你贴的例子。现在,我如何通过引用修改代码1中的函数hello?谢谢你的回答。我知道你贴的例子。现在,我如何通过引用修改代码1中的函数hello?