, заданной в начале примера.
>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...