下面先看一道题:
(function() { var x = y = 1; })(); console.log(y); // 1 console.log(x); // Uncaught ReferenceError: x is not defined
本题考查三个知识点:
1、js引擎对赋值的解析
A = B;
赋值表达式,A和B都可以是表达式,但是A必须是一个左值,即可以被赋值的表达式。B可以是任意表达式。
整个流程如下:
计算表达式A,得到一个引用refA;
计算表达式B,得到一个值valueB;
将valueB赋给refA指向的名称绑定;
返回valueB。
所以 A = B = C = d其实等于如下:
A = (B = (C = D));
总结:
对于单个赋值运算,JS引擎总是先计算左边的操作数,再计算右边的操作数。
2、连等赋值的解析
A = (B = (C = D));
a)计算表达式A得到refA
b)计算表达式B得到refB
c)计算表达式C得到refC
d)计算表达式D得到值valD
如下
refA = (refB = (refC = valD))
e)将valD赋值给refC,返回valD
f)将valD赋值给refB,返回valD
g)将valD赋值给refA,返回valD
总结:
先从左到右解析各个引用,然后计算最右侧的表达式的值,最后把值从右到左赋给各个引用。
3、未被var声明的变量即是声明的全局变量
var x = y = 1;代码中y未被var声明,所以是全局变量
了解了以上3点,下面对整个代码进行分析
(function() { var x = y = 1; // var x = (y = 1) --> var x =1;y=1; })();