关于连等赋值

315 阅读1分钟

1、经典引子

var a = {n:1};  
a.x = a = {n:2};  
console.log(a.x);

答案:undefined

理解:

实际执行过程:从右到左,a 先被赋值为{n:2},随后a.x被赋值{n:2},但a.x中的a指向{n:1}.即起始a和a.x中的a都是指向{n:1}这个对象的,然后从右往左执行,a先被赋值为{n:2},而此时a.x中的a还是指向{n:1},也就是说{n:1}对象的x属性被赋值{n:2},此时a是指向{n:2}的,这个对象中没有x属性,故输出undefined.

所以用b指向{n:1}会有如下结果:

var a = {n:1};  
var b = a; // 持有a,以回查  
a.x = a = {n:2};  
alert(a.x);// --> undefined  
alert(b.x);// --> [object Object] 真实值:{n:2}

2、加深巩固

function fun(){  
    var a = b = 5;  
}  
fun();  
alert(typeof a); // --> undefined  
alert(typeof b); // --> number 

理解:

JS分全局作用域与函数作用域
① 执行函数fun(),连等赋值从左到右,先进行赋值操作b=5, b从一开始就未定义,根据ES5,会在全局作用域定义b,相当于在最外层放一个var b = undefined; 这里赋值完成,所以全局b=5,b的类型为number.
②执行赋值操作,将b赋给a,a在函数作用域中,外面访问不到,故为undefined.