Области видимости переменных

Прежде чем использовать переменную, ее необходимо предварительно объявить. До объявления переменная не видна в программе. Объявить переменную можно глобально (вне функций) или локально (внутри функций или блока).

  • Глобальные переменные — это переменные, объявленные в программе вне функций. Глобальные переменные видны в любой части файла, в котором они объявлены, включая функции.
  • Локальные переменные — это переменные, которые объявлены внутри функций. Локальные переменные видны только внутри функции или вложенного блока. Инициализация таких переменных производится при каждом вызове функции. После выхода из функции локальная переменная уничтожается.
  • Локальные переменные внутри блока — это переменные (или константы), которые объявлены внутри неименованного блока (в области, ограниченной фигурными скобками) с помощью ключевого слова let (или const). Такие переменные видны только внутри блока и во вложенных блоках. Инициализация таких переменных производится при каждом входе в блок. После выхода из блока переменная уничтожается.

Если имя локальной переменной совпадает с именем глобальной переменной, то все операции внутри функции осуществляются с локальной переменной, а значение глобальной не изменяется.

Область видимости глобальных и локальных переменных приведена в листинге 3.2.

Листинг 3.2. Область видимости переменных

function func() {
   var n = 10;              // Локальная переменная
   let x = 60;              // Локальная переменная
   const LY = 7;            // Локальная константа
   // Доступ к глобальным переменным и константам
   console.log(g1);         // 5
   console.log(GX);         // 8
   // Можно изменить значение глобальной переменной
   g1 = 33;
   // Доступ к локальным переменным и константам
   console.log(n);          // 10
   console.log(x);          // 60, а не 3
   console.log(LY);         // 7
   // Изменяется локальная переменная
   x = 88;
}

var g1 = 5;                 // Глобальная переменная
let x = 3;                  // Глобальная переменная
const GX = 8;               // Глобальная константа

// Вызываем функцию
func();

console.log(g1);            // 33 (значение изменилось)
console.log(x);             // 3  (значение не изменилось)
console.log(GX);            // 8

Очень важно учитывать, что переменная, объявленная внутри блока с помощью ключевого слова let, видна только в пределах блока (внутри фигурных скобок). Например, присвоим значение переменной в зависимости от некоторого условия:

// Неправильно!!!
let x = 10;
if (x == 10) { // Какое-то условие
   let y;
   y = 5;
   console.log(y);
}
else {
   let y;
   y = 25;
   console.log(y);
}
// console.log(y); // Ошибка! Переменная y здесь не видна!
// ReferenceError: y is not defined

В этом примере переменная y видна только внутри блока. После условного оператора if переменной не существует. Чтобы переменная была видна внутри блока и после выхода из него, необходимо поместить объявление переменной перед блоком:

// Правильно
let x = 10;
let y = 0;
if (x == 10) { // Какое-то условие
   y = 5;
   console.log(y);
}
else {
   y = 25;
   console.log(y);
}
console.log(y);

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

{ // Блок
   var x = 3;
   let y = 25;
   const Z = 10;
}
console.log(x);    // 3. OK
// console.log(y); // Ошибка! Переменная y здесь не видна!
// ReferenceError: y is not defined
// console.log(Z); // Ошибка! Константа Z здесь не видна!
// ReferenceError: Z is not defined

Заметьте, что к переменной, объявленной с помощью ключевого слова var, это правило не применяется.

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

var x = 1;
let y = 2;
{ // Блок
   var x = 3;
   let y = 25;
   console.log(x);    // 3
   console.log(y);    // 25
   { // Блок
      var x = 16;
      let y = 77;
      console.log(x); // 16
      console.log(y); // 77
   }
}
console.log(x);       // 16 (Значение изменилось!)
console.log(y);       // 2  (Значение не изменилось)

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

for (let i = 0; i < 10; i++) {
   console.log(i);
}
// console.log(i); // Ошибка! Переменная i здесь не видна!
// ReferenceError: i is not defined

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

for (var i = 0; i < 10; i++) {
   console.log(i);
}
console.log(i); // 10. OK

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

Помощь сайту

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

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