为什么“在窗口中”for循环初始化会导致语法错误?

时间:2013-01-31 01:13:14

标签: javascript

这很有效。

var a = 'ontouchstart' in window;
for (;;) {
  console.log(a);
  break;
}

这会导致语法错误。为什么呢?

for (var a = 'ontouchstart' in window;;) {
  console.log(a);
  break;
}

这很有效。

for (var a = ('ontouchstart' in window);;) {
  console.log(a);
  break;
}

1 个答案:

答案 0 :(得分:4)

  

这会导致语法错误。为什么呢?

避免与for-in-loops混淆。 syntax specification for for-loops是明确的:

  

IterationStatement : for ( ExpressionNoIn <子> opt ; Expression <子> opt ; Expression <子> opt ) Statement

     

IterationStatement : for ( var VariableDeclarationListNoIn ; Expression <子> opt ; Expression <子> opt ) Statement

NoIn后缀在整个句法语法中传播,并以11.8 Relational Operators (Syntax) section结尾:

RelationalExpression :

ShiftExpression
RelationalExpression < ShiftExpression
RelationalExpression > ShiftExpression
RelationalExpression <= ShiftExpression
RelationalExpression >= ShiftExpression
RelationalExpression instanceof ShiftExpression
RelationalExpression in ShiftExpression

RelationalExpressionNoIn :

ShiftExpression
RelationalExpressionNoIn < ShiftExpression
RelationalExpressionNoIn > ShiftExpression
RelationalExpressionNoIn <= ShiftExpression
RelationalExpressionNoIn >= ShiftExpression
RelationalExpressionNoIn instanceof ShiftExpression
  

注意:需要使用NoIn变体,以避免在for语句中将in运算符与in运算符混淆。

但是,我不明白为什么在正常的for循环中使用NoIn变体 - 它们在for-in-productions中是合理的。我想这是为了避免程序员混淆并简化解析器。