作为参数传递给函数的对象的引用会改变吗?

时间:2015-01-09 07:19:48

标签: javascript

为什么在更改函数中a.y的引用后a未定义?

var a = { x : 1 };
a = { y : 2 };
function _change(b) {
    b = { y : 3 };
    return b;
}

_change(a);
document.write(a.y);   // undefined
document.write(a.x);   //1

以下代码表现不同

var a = {x:1};
var b={y:1};
b=a;
a.x //undefined
a.y //1

为什么?

3 个答案:

答案 0 :(得分:1)

因为您使用{x:1}完全更改了对象{y:2},所以对象中没有x属性。

我认为你需要像这样使用:

var a = {x:1};
a.y = 2;//assign y = 2 in a oject.

因此,在更改功能中执行相同的操作。

答案 1 :(得分:1)


第一块

这是我逐行运行代码所得到的:



var a = {x:1};  // <-- sets a to the object {x:1}
a = {y:2}; // <-- sets a to the object {y:2}, so it no longer has a.x = 1

function _change(b)
{
    b= { y:3};
    return b;
}

_change(a); // <-- this doesn't change a, it returns {y: 3} but it is not used

document.write(a.y); // 2 actually
document.write(a.x); // undefined
&#13;
&#13;
&#13;


让我们试着理解它......

var a = {x:1};

您声明了变量a,您创建了一个对象{x:1},并将a设置为该对象。

a = {y:2};

您可以创建一个新对象{y:2}并为其设置a。所以a不再拥有第一个对象。

所以......当你要求a.y时,2a.x,当你要求undefined时,它是{y:2},因为对象x没有&a #39; t {x:1}。请记住,您已将变量{y:2}的对象从var a = {x:1}; // <-- sets a to the object {x:1} a.y = 2; // <-- Add a field y to the object of the variable a, it has the value 2 function _change(b) { b.y = 3; // <-- actually modify the object, now the field y has value 3 return b; } _change(a); document.write(a.y); // 3 document.write(a.x); // 1替换为var a = {x:1}; // <-- sets a to the object {x:1} var b={y:1}; // <-- sets b to the object {y:1} b=a; // <-- now sets b to the object {x:1} - nobody has {y:1} anymore document.write(a.x); // 1 actually document.write(a.y); // undefined


相反,您可以动态添加字段,如下所示:

&#13;
&#13;
b=a
&#13;
&#13;
&#13;


第二座

同样,我得到了与你不同的结果......我想知道你在哪里运行你的代码。

&#13;
&#13;
b
&#13;
&#13;
&#13;

好的,所以当你说a时,你要让变量b指向与变量{x:1}相同的对象。通过这样做,变量b不再指向对象a ...这是无关紧要的,因为您还没有使用变量{x:1}

变量y一直有{{1}},您可以看到它没有定义任何字段{{1}}。


似乎你认为分配一个对象会以某种方式融合对象,导致双方都有字段的组合......如果你打算这样做,你可能会对How can I merge properties of two JavaScript objects dynamically?感兴趣。

答案 2 :(得分:0)

您需要将其分解并了解不同lexical scopes中的变量。

全球词汇范围内的

a

var a = {x:1};
a = {y:2};

上述初始化将解析为:

a = {y:2};

//hence at this global lexical scope 
//`lexicalscope = {"a":{y:2}};`

现在,让我们看看函数词法范围内的变量:

function _change(b){
       // at the function's `lexicalEnvironment = {"b":{y:2}}`
        b= { y:3};
       //  at this point `lexicalEnvironment = {"b":{y:3}}`
        return b;  //returned {y:3}.
    }

a为参数调用函数时。

_change(a); // obtained {y:3} but not captured.

我希望在此answer中包含有关a的值不会超出此函数范围的原因的美妙解释,但是,不想复制原始答案。想分享相关部分,

  

实际上,这意味着如果您更改参数本身(与a一样),   这不会影响喂食的物品   进入参数。但是如果更改参数的INTERNALS,例如b.y = 3,   会传播回来。

再次,在全局词汇范围内打印它们的值。

console.log(a.y); // still in the global lexical environment a.y = 2;
console.log(a.x); // `a.x` is undefined in the global Lexical Environment.