Выразительный JavaScript (Хавербеке) - страница 23

, заданной в начале примера.

>var x = "outside";


>var f1 = function() {

>  var x = "inside f1";

>};

>f1();

>console.log(x);

>// → outside


>var f2 = function() {

>  x = "inside f2";

>};

>f2();

>console.log(x);

>// → inside f2

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

Вложенные области видимости

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

К примеру, следующая довольно бессмысленная функция содержит внутри ещё две:

>var landscape = function() {

>  var result = "";

>  var flat = function(size) {

>    for (var count = 0; count < size; count++)

>      result += "_";

>  };

>  var mountain = function(size) {

>    result += "/";

>    for (var count = 0; count < size; count++)

>      result += "'";

>    result += "\\";

>  };


>  flat(3);

>  mountain(4);

>  flat(6);

>  mountain(1);

>  flat(1);

>  return result;

>};


>console.log(landscape());

>// → ___/''''\______/'\_

Функции >flat и >mountain видят переменную >result, потому что они находятся внутри функции, в которой она определена. Но они не могут видеть переменные >count друг друга, потому что переменные одной функции находятся вне области видимости другой. А окружение снаружи функции >landscape не видит ни одной из переменных, определённых внутри этой функции.

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

Люди, изучавшие другие языки программирования, могут подумать, что любой блок, заключённый в фигурные скобки, создаёт своё локальное окружение. Но в JavaScript область видимости создают только функции. Вы можете использовать отдельно стоящие блоки:

>var something = 1;

>{

>  var something = 2;

>  // Делаем что-либо с переменной something...