JavaScript. Подробное руководство, 6-е издание, стр. 148

<b>  let total = 0, result=[]; // Определены в любой точке функции</b>

<b>  for(let х = 1; х &lt;= n; х++) { // переменная х определена только в цикле</b>

<b>    let odd = 2*х-1; // переменная odd определена только в цикле</b>

<b>    total += odd; </b>

<b>    result.push(total),</b>

<b>  }</b>

<b>  // Попытка обратиться к переменной х или odd здесь</b>

<b>  // вызовет исключение ReferenceError return result;</b>

<b>}</b>

<b>oddsums(5); // Вернет [1,4,9,16,25]</b>

Обратите внимание, что в этом примере инструкция

<b>let</b>
используется так же, как замена инструкции
<b>var</b>
в цикле
<b>for</b>
. Она создает переменную, которая будет доступна только в теле цикла и в выражениях проверки условия и увеличения цикла. Точно так же можно использовать инструкцию
<b>let</b>
в циклах
<b>for/in</b>
<b>for each</b>
; раздел 11.4.1):

<b>о = {х:1,у:2};</b>

<b>for(let р in о) console.log(p);      // Выведет х и у</b>

<b>for each(let v in о) console.log(v); // Выведет 1 и 2</b>

<b>console.log(p)                       // ReferenceError: p не определена</b>

Существует одно интересное отличие между случаями, когда

<b>let</b>
используется как инструкция объявления и когда
<b>let</b>
используется как инструмент инициализации переменной цикла. При использовании
<b>let</b>
в качестве инструкции объявления значение выражения инициализации вычисляется в области видимости переменной. Но в цикле
<b>for</b>
выражение инициализации вычисляется за пределами области видимости новой переменной. Это отличие становится важным, только когда имя новой переменной совпадает с именем уже существующей переменной:

<b>let х = 1;</b>

<b>for(let х = х + 1; х &lt; 5; х++)</b>

<b>   console.log(x); // Выведет 2,3,4</b>

<b>{              // Начало блока, чтобы образовать область видимости новой переменной</b>

<b>let х = х + 1; // переменная х не определена, поэтому х+1 = NaN</b>

<b>console.log(x); // Выведет NaN</b>

<b>}</b>

Переменные, объявленные с помощью инструкции

<b>var</b>
, определены в любой точке функции, где они объявлены, но они не инициализируются, пока инструкция
<b>var</b>
не будет выполнена фактически. То есть переменная существует (обращение к ней не вызывает исключение ReferenceError), но при попытке использовать переменную до инструкции
<b>var</b>
она будет иметь значение
<b>undefined</b>
. Переменные, объявляемые с помощью инструкции
<b>let</b>
, действуют аналогично: если попытаться использовать переменную до инструкции
<b>let</b>
(но внутри блока, где находится инструкция
<b>let</b>
), переменная будет доступна, но она будет иметь значение
<b>undefined</b>
.

Примечательно, что данная проблема отсутствует при использовании

<b>let</b>
для объявления переменной цикла - просто сам синтаксис не позволяет использовать переменную до ее инициализации. Существует еще один случай использования инструкции
<b>let</b>
, где отсутствует проблема использования переменной до ее инициализации. Блок, образуемый инструкцией
<b>let</b>
(в противоположность объявлению переменной с помощью инструкции
<b>let</b>
, показанному выше), объединяет блок программного кода с объявлением переменных для этого блока и их инициализацией. В этом случае переменные и выражения их инициализации заключаются в круглые скобки, за которыми следует блок инструкций в фигурных скобках:

<b>let х=1, у=2;</b>

<b>let (х=х+1,у=х+2) { // Отметьте, что здесь выполняется сокрытие переменных</b>

<b>  console.log(х+у); // Выведет 5</b>

<b>};</b>

<b>console.log(x+y); // Выведет 3</b>

Важно запомнить, что выражения инициализации переменных let-блока не являются частью этого блока и интерпретируются в другой области видимости. В примере выше создается новая переменная х, и ей присваивается значение, на единицу больше, чем значение существующей переменной х.

Последний случай использования ключевого слова

<b>let</b>
является разновидностью let-блока, в котором вслед за списком переменных и выражений инициализации в круглых скобках следует единственное выражение, а не блок инструкций. Такая конструкция называется let-выражением, а пример выше можно было переписать, как показано ниже:

<b>let х=1, у=2;</b>

<b>console.log(let (х=х+1,у=х+2) х+у); // Выведет 5</b>

Некоторые формы использования ключевых слов

<b>const</b>
и
<b>let</b>
(не обязательно все четыре, описанные здесь) в будущем наверняка будут включены в стандарт ECMAScript.

Версии JavaScript

В этой главе при упоминании какой-то определенной версии JavaScript подразумевается версия языка, реализованная проектом Mozilla в интерпретаторах Spider monkey и Rhino и в веб-броузере Firefox.

Некоторые расширения языка, представленные здесь, определяют новые ключевые слова (такие как

<b>let</b>
), и, чтобы избежать нарушения работоспособности существующего программного кода, использующего эти ключевые слова, JavaScript требует явно указывать версию, чтобы иметь возможность использовать расширения. Если вы пользуетесь автономным интерпретатором Spidermonkey или Rhino, версию языка можно указать в виде параметра командной строки или вызовом встроенной функции
<b>version().</b>
(Она ожидает получить номер версии, умноженный на сто. Чтобы получить возможность использовать ключевое слово
<b>let</b>
, нужно выбрать версию JavaScript 1.7, т.е. передать функции число 170.) В Firefox указать номер версии можно в теге script: