var x=0, y=0;
var z=
x
++
++
y
注释说:
由于后缀递增/递减运算符(I/DO)和操作数之间的LineTerminator(LT)是不允许的,自动分号插入后两个引用之间用[LT]分隔的两个IO(就像两个DO及其组合)导致语法错误
为什么这段代码会导致语法错误?我认为这是一个有效的代码片段。上面的代码等于var z=x; ++ ++ y;
。javascript语法允许表达式++ ++ y
。所以有什么问题?
var x=0, y=0;
var z=
x
++
++
y
注释说:
由于后缀递增/递减运算符(I/DO)和操作数之间的LineTerminator(LT)是不允许的,自动分号插入后两个引用之间用[LT]分隔的两个IO(就像两个DO及其组合)导致语法错误
为什么这段代码会导致语法错误?我认为这是一个有效的代码片段。上面的代码等于var z=x; ++ ++ y;
。javascript语法允许表达式++ ++ y
。所以有什么问题?
此代码将变为:
var z = x;
++ ++ y;
++ ++ y
是问题的根源。让我们看看为什么...
++ ++ y
被评估为++(++y)
. 第一步是评估(++y)
。++
运算符增加它旁边的变量引用的值,并返回增加的值。这里重要的部分是它不返回一个引用,只是一个值。所以第二步是++(1)
, (或任何++y
产生的),这是一个错误,因为只能增加引用。
评估为:
var x = 0, y = 0;
var z = x ++ ++ y; //MAKES NO SENSE!
语法不允许在++
or--
运算符之前使用换行符;这样的换行符必须转换为;
. 因此,表达式必须被解析为好像它是:
var x = 0 , y = 0 ;
var z = x ;
++ ;
++ y ;
第三行是非法的。
参考:
第 7.9.1 节,“自动分号插入规则”,规则 3
第 11.3 节,“11.3 后缀表达式”。