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.