为什么在更改函数中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
为什么?
答案 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;
让我们试着理解它......
var a = {x:1};
您声明了变量a
,您创建了一个对象{x:1}
,并将a
设置为该对象。
a = {y:2};
您可以创建一个新对象{y:2}
并为其设置a
。所以a
不再拥有第一个对象。
所以......当你要求a.y
时,2
有a.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
。
相反,您可以动态添加字段,如下所示:
b=a
&#13;
同样,我得到了与你不同的结果......我想知道你在哪里运行你的代码。
b
&#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.