3.10. Область видимости переменной

Область видимости (scope) переменной - это та часть программы, для которой эта переменная определена. Глобальная переменная имеет глобальную область видимости - она определена для всей JavaScript-программы. В то же время переменные, объявленные внутри функции, определены только в ее теле. Они называются локальными и имеют локальную область видимости. Параметры функций также считаются локальными переменными, определенными только в теле этой функции.

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

var scope = "global"; // Объявление глобальной переменной

function checkscope() {

  var scope = "local"; // Объявление локальной переменной с тем же именем

  return scope; // Вернет локальное значение, а не глобальное

}

checkscope()   // => "local"

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

scope = "global";// Объявление глобальной переменной, даже без var.

function checkscope2() {

scope = "local"; // Ой! Мы изменили глобальную переменную.

myscope = "local"; // Неявно объявляется новая глоб. переменная.

return [scope, myscope];// Вернуть два значения.

checkscope2() // => ["local", "local"]: имеется побочный эффект!

scope // => "local": глобальная переменная изменилась.

myscope // => "local": нарушен порядок в глобальном пространстве имен.

Определения функций могут быть вложенными. Каждая функция имеет собственную локальную область видимости, поэтому может быть несколько вложенных уровней локальных областей видимости. Например:

var scope = "global scope"; // Глобальная переменная

function checkscopeO {

  var scope = "local scope”; // Локальная переменная

  function nestedO {

    var scope = "nested scope"; // Вложенная область видимости локальных переменных

    return scope; // Вернет значение этой переменной scope

  }

  return nested();

}