一、拷贝引物的代码如下: var a={ n :1 };a . x=a={ n :2 };alert(a . x);//-undefined这是蔡彩在阅读jQuery源代码时对这种写法的发现。上面第二句a.x=a={n:2}是一个连续赋值表达式。引擎内部的这个连续赋值表达式怎么了?怎么解释?二、猜想猜想1:从左到右,a.x首先被赋值为{n:2},但随后a被赋值为{n33602},即a被重写为值{n33602},新a没有x属性,因此未定义。以下步骤1,a . x={ n :2 };2、a={ n :2 };这种解释的结果与实际操作结果一致,似乎是正确的。请注意,a.x已在1中分配。猜想2:从右到左,a首先被赋值为{n:2}。在a.x发现a被重写后(a之前是{a:1},a.x={n33602}引擎限制a.x的赋值并忽略它。以下步骤:1、a={ n :2 };2、a.x未赋值{n:2}相当于a.x=(a={n33602}),即执行第一步,可以说明a.x未定义。请注意,2中的a.x从未分配过。3.证明大多数人都有以上两种猜想。小组里的讨论被认为是猜想1,我认为是猜想2。其实都是错的。我忽略了引用关系。如下,添加一个变量b,指向a,复制的代码如下: vara={ n 33601 };var b=a;//暂时保存a . x=a={ n :2 };alert(a . x);//-未定义的警报(b . x);//-[object Object]发现a.x还是未定义,神奇的是b.x还没有赋值(例如b.x={n:2}),却变成了[object Object]。b指向a({n:1}),只有在执行a. x={n33602}时,b才能有x属性。实际执行过程:从右到左,首先将a赋值为{n:2},然后将a.x赋值为{n33602}。1,a={ n :2 };2、a . x={ n :2 };相当于a . x=(a={ n :2 });与猜想2的区别在于a.x被赋值,而猜想2没有被赋值。最重要的区别是,第一步a={n:2}中的a指向新对象{n33602},第二步a.x={n33602}中的a为{a:1}。也就是说,这个偶数语句中复制的代码如下:a。x=a={ n 33602 };在a.x中,a指向{n:1},a指向{n33602}。下图。
四:写完这篇短文,可能有些人看完还头晕。因为里面写的描述真的是迂回的方式。刚开始理解这个偶数赋值语句的时候,我复制代码如下: var A={ n 33601 };a . x=a={ n :2 };认为引擎会限制a.x的重写(A被重写后),但事实并非如此。指向的对象不同。引擎不限制重写a.x={n:2}。感谢所有参与讨论的人:蔡彩、代岱、儒学。这个问题最早是蔡彩提出来的。儒家对灰色新秀群体中的每一次讨论都是如此投入和认真,即使这是别人提出的话题。五:结束,以另一个连续的作业问题结束。fun执行后,这里的变量B溢出fun,成为全局变量。你想过吗?复制代码如下:函数fun(){ var a=b=5;} fun();警报(a型);//-未定义的警报(类型b);//-数字