2013-06-27 2 views
8

Я играю с let в Node.JS (требуется флаги --harmony и --use-strict). Как я понимаю, оператор let разрешает объявления с блочным охватом. Учитывайте следующее:Действительно ли для циклов неявно создавать блок?

let a; 
for(let i = 0; i < 3; i += 1) { 
    console.log(i); 
} 

Сколько блоков охвачено? В каком блоке области i жить? Правильно ли я полагаю, что для этого примера работать, есть области блока, с одной областью, неявно созданной циклом for, следующим образом?

{ // block #1 
    let a; 
    { // block #2 (contains `i`) 
    let i; 
    for(i = 0; i < 3; i += 1) { // block #3 
     console.log(i); 
    } 
    } 
} 
+0

А, я вижу, что вы там делали. Очевидно, что для ясности вы не хотите этого делать в реальном коде. Некоторые языки, такие как C#, фактически препятствуют повторному использованию имени переменной во внутренней области (чтобы обеспечить ясность), хотя это сработает. –

+0

, если вы используете let, вы получаете область блока, по крайней мере, в циклах. – dandavis

+0

Это похоже на то, что вы можете объявить много переменных с тем же именем внутри функции, например, и это допустимо с 'let', но не' var'. – elclanrs

ответ

6

На основании последних (14 мая 2013 г.) draft of ES6: да.

Вы можете найти следующее в разделе 12.6.3, в котором говорится, что дополнительный среда (сфера) создается, когда for оператор включает в себя LexicalDeclaration (let или const):

ИнструкцияИтерации: для (LexicalDeclarationNoIn; Expression отказа; Expression неавтоматического) Заявление

  1. Пусть oldEnv быть текущий контекст исполнения в LexicalEnvironment.
  2. Пусть loopEnv быть результатом вызова NewDeclarativeEnvironment прохождения oldEnv в качестве аргумента.
  3. ...

Имейте в виду, однако, что это все еще может измениться.

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