7

这行得通。

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;
}
4

1 回答 1

4

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

避免与 for-in-loop 混淆。for 循环的语法规范是明确的:

IterationStatement : for ( ExpressionNoInopt; Expressionopt; Expressionopt) Statement

IterationStatement : for ( var VariableDeclarationListNoIn ; Expressionopt; Expressionopt) Statement

这个NoIn后缀贯穿整个句法语法,并在11.8 关系运算符(句法)部分结束:

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需要变体以避免将关系表达式中的 in 运算符与 for 语句中的 in 运算符混淆。

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

于 2013-01-31T01:31:37.403 回答