Область переменных и констант

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

Обсуждение

В таких языках как C++ также есть "область блока"; любая пара фигурных скобок ({}) определяет новую область. JScript не поддерживает области блоков.

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

// Define two global variables.
var name : String = "Frank";
var age : int = "34";

function georgeNameAge() {
   var name : String; // Define a local variable.
   name = "George";   // Modify the local variable.
   age = 42;          // Modify the global variable.
   print(name + " is " + age + " years old.");
}

print(name + " is " + age + " years old.");
georgeNameAge();
print(name + " is " + age + " years old.");

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

Frank is 34 years old.
George is 42 years old.
Frank is 42 years old.

В JScript объявления переменных и констант обрабатываются до любого другого кода, поэтому неважно, находится ли объявление внутри условного блока или другой конструкции. После того, как в JScript будут найдены все переменные и константы, начинается выполнение кода функции. Это означает, что определение значения локальной константы отменяется до тех пор, пока не будет достигнут оператор объявления константы, и что определение локальной переменной отменяется до тех пор, пока оно не будет присвоено в функции.

Иногда это может привести к непредвиденному поведению. Рассмотрим следующий пример.

var aNumber = 100;
var anotherNumber = 200;
function tweak() {
   var s = "aNumber is " + aNumber + " and ";
   s += "anotherNumber is " + anotherNumber + "\n";
   return s;
   if (false)  {
      var aNumber;                // This statement is never executed.
      aNumber = 123;              // This statement is never executed.
      const anotherNumber = 42;   // This statement is never executed.
   } // End of the conditional.
} // End of the function definition.

print(tweak());

После выполнения этой программы выводится следующий результат:

aNumber is undefined and anotherNumber is undefined

Можно предполагать, что значение aNumber будет равно 100 или 123, а значение anotherNumber будет равно 200 или 42, но на самом деле оба значения будут равны undefined. И aNumber, и anotherNumber определяются с локальной областью, они затеняют глобальную переменную и константу с таким же именем. Код инициализирует локальную переменную, а константа не выполняется, поэтому значения в обоих случаях — undefined.

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

См. также

Основные понятия

Неопределенные значения

Другие ресурсы

Переменные и константы в JScript