滥用赋值运算符的RTL关联性是常见的做法(或至少在语法上在跨浏览器和JS实现上在语法上有效),以便一个可以定义两个变量(第一个是对象),以便第二个分配给一个(新)该对象的命名属性,该对象本身已分配给另一个值,因此不会生成SyntaxError()?
我知道这听起来很复杂,但这是代码:
var x = {}, y = x.l = 9; // generates no errors
console.log(x.l, y); // 9 9
因为:
var t = {}, t.l = 9; // Syntax Error, no doubt because t is already defined
答案 0 :(得分:1)
该行:
var x = {}, y = x.l = 9;
有效地变为:
var x = {};
var y = x.l = 9;
,其处理方式为:
// Parse phase
var x; // assigned the value undefined
var y; // assigned the value undefined
// Execution phase
x = {};
x.l = 9;
y = x.l;
请注意,在赋值表达式中,右边的值分配给了左边的表达式。复合分配是从左到右评估,但从右到左是分配,因此x.l = 9
在y = x.l
之前被分配,即使它在右边
现在用第二个例子尝试一下:
var t = {}, t.l = 9;
成为:
// Parse phase
var t; // assigned the value undefined
var t.l; // syntax error, stop
语句开始处的 var 关键字表示下一件事必须是有效的标识符。 t.l
不是有效的标识符(只能解释为标识符,后跟点属性访问器),仅此而已。一切都停止了。
答案 1 :(得分:0)
您需要使用分号-这就是解析器期望的错误:
var t = {};
t.l = 9;
console.log(t);