Ключевые слова var и let

Переменные могут быть объявлены с помощью ключевых слов var или let. Ключевое слово var создает глобальную переменную, если объявление расположено вне функции:

var x = 10;

В Web-браузере переменная x автоматически становится свойством глобального объекта window. Но в Node.js нет объекта window. Кроме того, в Node.js на самом деле переменная x не является глобальной для всей программы. Ее область видимости ограничена файлом, в котором она объявлена. Но она видна во всех функциях, определенных внутри файла.

Ключевое слово let объявляет переменную уровня видимости блока. Если она используется для объявления переменной вне блоков, то, как и при использовании ключевого слова var, ее область видимости будет ограничена файлом, в котором она объявлена:

let x = 10;

Во многих языках программирования, переменная, объявленная внутри блока (внутри фигурных скобок), не видна после блока. В языке JavaScript при объявлении переменной с помощью ключевого слова var это не так. Если мы объявляем переменную внутри блока, например, в первом параметре цикла for, то переменная будет видна и после закрывающей фигурной скобки:

for (var i = 0; i < 5; i++) {
   console.log(i);
}
console.log('i =', i); // i = 5

Результат будет аналогичным при объявлении переменной внутри блока:

var x = 5;
if (x == 5) {
   var y = x + 10;
}
console.log('y =', y); // y = 15

При объявлении переменных с помощью ключевого слова let, область видимости переменных будет ограничена блоком, в котором переменная объявлена. Переменная будет также видна и во все вложенных блоках, а вот вне блока она видна не будет:

let x = 5;
if (x == 5) {
   let y = x + 10;
}
console.log('y =', typeof y); // y = undefined

При объявлении переменных в первом параметре цикла for область видимости будет ограничена телом цикла:

for (let i = 0; i < 5; i++) {
   console.log(i);
}
console.log('i =', typeof i); // i = undefined

В одной инструкции можно объявить сразу несколько переменных через запятую и присвоить им начальные значения:

{
   let x, y = 10;
   x = y + 5;
   console.log(x, y);         // 15 10
}
console.log('x =', typeof x); // x = undefined
console.log('y =', typeof y); // y = undefined

В этом примере мы использовали блок без привязки к какой-либо другой конструкции. Этот блок просто ограничивает область видимости переменной.

Повторное объявление переменной приведет к ошибке:

{
   let x = 5;
   let x = 20; // SyntaxError: Identifier 'x' has already been declared
}

При использовании ключевого слова var ошибки не будет:

var x = 5;
var x = 20;
console.log(x); // 20

Ошибка также возникнет при обращении к переменной до ее объявления:

{
   console.log('x =', x);
   // ReferenceError: Cannot access 'x' before initialization
   let x = 20;
}

При использовании ключевого слова var мы получили бы значение undefined:

console.log('x =', x); // x = undefined
var x = 20;

Если же переменную не объявить вообще и попытаться ее использовать, то получим ошибку при запуске программы:

console.log('x =', x); // ReferenceError: x is not defined

Однако если переменной присвоить значение, то ошибки не будет, хотя мы и не объявляем переменную:

x = 10;
console.log('x =', x); // x = 10
Примечание

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов