文章目录
1
2
3
4
5
var a = {n:1};  
var b = a; // 持有a,以回查
a.x = a = {n:2};
alert(a.x);// --> undefined
alert(b.x);// --> {n:2}

关键点在于‘.‘符号的运算优先于=,所以Lemures这位大神说的解析器在接受到 a.x = a = {n:2}这样的语句后:找到 aa.x 的指针。如果已有指针,那么不改变它。如果没有指针,即那个变量还没被申明,那么就创建它,指向 null。所以会优先创建a.x,然后把他们的指针都指向{n:2}.

现在的关系就变成了b虽然是指向a,但是本质的说b应该是指向原本a的内存块-first,然后由于’.’的优先性,在a被赋值给另外一个内存块-second{n:2}之前,已经优先创建了a.x,所以a.x是存在于原本的内存块-first中的,b的值所以是b => {n: 1, x: {n: 2 } };然后现在a已经被重新指向内存块-second,所以a不再拥有a.x这个属性a => {n: 2}

文章目录