分配给变量的JavaScript函数表达式(通过引用或值传递?)
我对以下代码有疑问。我认为分配给JS中变量的数据类型原语是通过值传递的,而对象是通过引用传递的。如果函数是JS中的对象,我认为它们应该通过引用传递,但以下两个代码的行为与值传递相同: 代码1分配给变量的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);
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?