Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.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_Function_Arguments - Fatal编程技术网

Javascript到底是如何传递参数的?

Javascript到底是如何传递参数的?,javascript,function,arguments,Javascript,Function,Arguments,有一个小测试。我希望两个obj\d对象的amenmber最终都会更改。然而,change1样式不起作用,我想知道为什么或者为什么不应该这样做 <button id="btn1" onclick="test()">Change</button> <script> var obj1 = { a : {strblahblah: "blah"} }; var obj2 = { a : {strblahblah: "blah"} }; funct

有一个小测试。我希望两个
obj\d
对象的
a
menmber最终都会更改。然而,
change1
样式不起作用,我想知道为什么或者为什么不应该这样做

<button id="btn1" onclick="test()">Change</button>
<script>
    var obj1 = { a : {strblahblah: "blah"} };
    var obj2 = { a : {strblahblah: "blah"} };
    function test(){
        change1(obj1.a);
        change2(obj2);
        alert("obj1: " + obj1.toSource() + "\r\nobj2: " + obj2.toSource());
    }

    function change1(obj){
        obj = {str: "change1"};
    }
    function change2(obj){
        obj.a = {str: "change2"};
    }
</script>

这句话
obj={str:“change1”}
导致
obj
引用传递的参数以外的内容

其中as
obj.a={str:“change2”}
导致传递的参数中的“a”属性更改为其他属性


在第一种情况下,您只是在更改输入的引用,而在另一种情况下,您实际上是在修改输入参数。

change1
中发生的事情是
obj
最初在
obj1.a
中保存对对象的引用。然而,该行:

obj = {str: "change1"};
obj.a = {str: "change2"};
不更改obj1.a
。相反,它创建一个新对象(
{str:“change1”}
)并更改
obj
,使其现在指向该对象,而不是
obj1.a

相比之下,
change2
具有
obj
初始持有对
obj2
中对象的引用,并且具有以下行:

obj = {str: "change1"};
obj.a = {str: "change2"};

它访问被引用对象(即
obj2
)的内部结构,从而对该对象进行实际更改。

当您将
obj1.a
传递到
change1()
时,您将发送本身是另一个对象的
obj1.a
的值。但是,当您将
obj2
发送到
change2()
时,它将引用对象,并且当您指定值时,原始值将发生更改,而在第一种情况下,这并没有发生

正如
thg437
所建议的,这最好地解释了这种情况

来自:

函数调用的参数是函数的参数。 参数通过值传递给函数。如果功能发生变化 参数的值,此更改不会在全局或 调用函数。但是,对象引用也是值,并且 它们是特殊的:如果函数更改引用对象的 属性,则该更改在函数外部可见

在change1中,您传递的是
obj.a
,它实际上是一个值(因为它是一个对象引用,而不是对象本身)。这意味着您将在
change1
中收到该引用的副本,然后将其修改为指向新对象。您所做的只是修改传递到函数中的引用副本,以便它有效地指向内存中的其他内容


change2
中,您正在传递
obj
,它也是一个对象引用,但随后您正在修改该引用的
a
属性,因此您将获得引用指向的对象并修改其
a
属性。修改的对象与您在函数中通过值接收的对象引用副本和代码顶部的引用
obj1
指向的对象相同。

change1中忘记
obj.a
。@simonzack OP将
a
作为参数传递给
change1
。它认为这是问题的基础(javascript通过引用或值传递)。嗯,引用,现在我可以更好地理解它了,但是,有什么方法可以做像
change1
这样的事情吗?因为我想修改
obj\d
a
,但我不想将
obj\d
本身暴露在
change
方法中,我想你可能想要这样的东西: