var a=b=1;
运行时会报错吗?怎么都有点想不明白,试着尝试运行了一下,发现并没有出错提示.
只是多了一个值为1的全局变量b.
有点不甘心,看到
var a = {n:1};
a.x = a = {n:2};
alert(a.x); // --> undefined
弹出undefined,感觉可能指的是这种情况会报错, 遂改写了一下
var a;
a.x = a = {n:2};
alert(a.x);
这回报错了!这里稍稍解释一下,以便新手能够理解:
1.赋值运行算的顺序是从右到左的;
2.JS垃圾回收不会在语句执行时进行.
a.x = a = {n:2}; 这条语句执行过程猜得没错的话应该是
1.查找a并得到a的引用
2.查找a.x发现未定义就重新分配内存并得他的引用3.再次查找a并得到a的引用
4.给{n:2}分配内存并得到他的引用
5.将新a的引用指向{n:2}的引用
//注意:这里本来应该回收旧a及旧a的x,但因为执行完这条语句后才能GC,所以尚未销毁a,即第2步中的旧a.x的引用在内存中仍然存在
6.将旧a的x指向新的a的引用
7.垃圾回收旧a及旧a的x
下面文章转自http://www.javaeye.com/topic/785445
===================================================一、引子
二、猜想
2, a = {n:2};
2, a.x 未被赋值{n:2}三、证明
2, a.x = {n:2};
等价于四:解惑
谢谢所有参与讨论的人:蔡蔡、猪大肠、呆呆、雅儒。这个问题最早是蔡蔡提出的。雅儒在 菜鸟灰呀灰 群里每次的讨论都那么投入,认真,哪怕是别人提出的话题。五:结束