2015-03-27 4 views

ответ

5

Это объясняется в section 11.14 "Comma Operator (,)":

Comma Operator ECMA Spec

*NoIn имеет ту же структуру, за исключением того, что в исключает использование in ключевого слова, раздел 11.8 "реляционные операторы" :

Relational Operators ECMA Spec

спецификация говорит:

Варианты «NoIn» необходимы, чтобы избежать путаницы оператора in в реляционном выражении с оператором in в операторе for.

Как in может использоваться двумя способами:

for (var x in foo) { ... } 

Или:

if ('x' in foo) { ... } 

Варианты «Ноин» находятся там, чтобы сделать его невозможно использовать второй вариант in выше в первом выражении цикла for. Таким образом, следующий код недействителен:

for (y = 'x' in foo; y; y = false) { ... } 
+0

Хорошо, я читал это 4 раза, и это начинает иметь смысл. Это плотный и глубокий материал. –

+0

Нажмите. Спасибо :) –

1

ExpressionNoIn - это не терминал, из которого могут быть получены все выражения, ожидание операции in (то есть 'prop' in obj).

Следуйте A3 от дна (где ExpressionNoIn определен) к первому *NoIn не-терминала, который не содержит (разные) *NoIn нетерминальный больше:

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 

Я думаю, что делает его легче различают for петли от for/in петель.

Смежные вопросы