连等赋值

下面先看一道题:

(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;
})();

参考文章:
由ES规范学JavaScript(二):深入理解“连等赋值”问题
关于JavaScript中连等赋值那点事

此条目发表在JavaScript分类目录。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注