Глобальные переменные

Проблема глобальных переменных

Известным антипаттерном является цепочка присваивания:

// антипаттерн, не используйте его
function foo() {
var a = b = 0;
// ...
}

В приведенном выше примере, происходит присваивание переменной b значения 0, а затем 0 присваивается локальной переменной a. Так как переменная b не является задекларированной, то происходит создание глобальной переменной b.

Для того, чтобы избежать появления глобальной переменной b, достаточно было объявить используемые переменные заранее:

function foo() {
var a, b;
// ...
a = b = 0; // теперь обе переменные локальны
}

Создание глобальных переменных опасно тем, что они могут конфликтовать с переменными среды, в которой работает ваша программа, а так же со сторонними библиотеками.

Сайд эффект

Технически, глобальные переменные не являются реальными переменными. Они являются свойствами глобального объекта. Свойства могут быть удалены оператором delete, переменные не могут:

// создадим три глобальных переменных
var global_var = 1;
global_novar = 2; // антипаттерн
(function () {
global_fromfunc = 3; // антипаттерн
}());
// attempt to delete
delete global_var; // false
delete global_novar; // true
delete global_fromfunc; // true
// test the deletion
typeof global_var; // "number"
typeof global_novar; // "undefined"
typeof global_fromfunc; // "undefined"

В ES5 strict mode, присваивание к недекларированной переменной вызовет ошибку

Источник – книга «JavaScript Patterns», Stoyan Stefanov
Редактировать на GitHub