Why does initialization "in window" in for for trigger a syntax error?

It works.

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

This causes a syntax error. Why?

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

It works.

 for (var a = ('ontouchstart' in window);;) { console.log(a); break; } 
+7
source share
1 answer

This causes a syntax error. Why?

To avoid confusion with for-in-loop. The syntax specification for for-loops is explicit:

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

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

This NoIn suffix extends throughout the syntactic grammar and ends in Section 11.8 Relational Operators (Syntax) :

 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 

NOTE. NoIn options NoIn needed to avoid confusing the in operator in a relational expression with the in operator in the for statement.

However, I don’t understand why NoIn options NoIn used in the usual for-loop - they are reasonable for in-in-productions. I assume that this will avoid the confusion of the programmer and simplify the parser.

+4
source

All Articles