пятница, 26 сентября 2014 г.

Переменные в JavaScript, область видимости

Переменные объявляются при помощи ключевого слова var.

var x = 42;
var z;
var a = 1, b = 2, c;

Возможно объявление сразу нескольких переменных (через запятую), Переменная может быть инициализирована одновременно с объявлением каким-либо значением. Неинициализированная переменная получает значение undefined.

Возможно объявление констант, которые не могут меняться во время выполнения. Ключевое слово - const. Инициализация констант должна происходить только в момент определения. Т.к. константы поддерживаются только в IE11+, принято именовать константы большими буквами. В ФП все переменные, по сути, являются константами, т.к. не переопределяются после создания.

Каждая переменная имеет свою область видимости. 

Два типа области видимости - глобальная и область видимости функции (блочной видимости нет). 

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

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

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

if (!("a" in window)) {
    var a = 1;
}
alert(a);

превращается в 

var a;
if (!("a" in window)) {
    a = 1;
}
alert(a);

Поэтому программа выводит undefined, т.к. переменная не инциализируется.

Однако в Node.JS код работает верно.

В обычном режиме все переменные, инициализированные без объявления, считаются глобальными (становятся свойствами глобального объекта), в strict mode инициализация без объявления невозможна.

Комментариев нет :

Отправить комментарий