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 演算子を混同しないようにするために必要です。

ただし、バリアントが通常の for ループで使用される理由がわかりません。for NoIn-in-production では妥当です。プログラマーの混乱を避け、パーサーを単純化するためだと思います。

于 2013-01-31T01:31:37.403 に答える