2014-03-07 42 views
3

当我在控制台中运行该代码(under a <script> code)为什么我的js代码不能反映正确的运行时间值?

window.msg = { a: 0} 
var b = window.msg; 

function g() 
{ 
    console.log(b) 
} 
msg = { a: 1}; 
g() 

- 我得到{A:0}。

这是为什么?我认为,如果你改变你的代码msg = { a: 1};将更新的参考...

+0

简单来说:分配一个新值变量**从不**(真的,从不!)改变另一个变量的值。 –

回答

4

您正在创建对象{ a: 0 },并将该对象的引用分配给msgb。后来,你要创建一个新的对象{ a: 1 },并msg分配给该对象的引用,但b仍引用原来的对象:

window.msg = { a: 0} // msg --> { a: 0 }, b --> undefined 
var b = window.msg; // msg --> { a: 0 }, b --> { a: 0 } 

msg = { a: 1};  // msg --> { a: 1 }, b --> { a: 0 } 
g()     // prints b --> { a: 0 } 
+0

如果我删除第一行,该怎么办? window.msg的值将是未定义的。但应该看到变化? – d11

+0

@ doomday1然后'b'将永远是'undefined'。关键是变量'msg'和'b'是相互独立的。给一个值赋值不会影响另一个值。但是,如果它们都引用* same *对象,那么当您通过一个变量操作该对象时(例如'msg.a = 1',如* Doge *的答案),您可以通过查看其他变量;即,虽然变量*本身*是独立的,但是引用的对象是相同的。 –

5

window.msg = { a: 0} 
var b = window.msg; 

function g() 
{ 
    console.log(b) 
} 
msg.a = 1; // this line is changed 
g() 

您将得到{a:1}

您正在重新分配msg因此b只是指向旧值msg

b未引用window.msg,而是{a:0}对象。

相关问题