По моему опыту, большинство функций JS, функций конструктора или функций шаблона модуля объявляются как глобальные или привязаны к объекту глобального пространства имен. В любом случае эти идентификаторы доступны глобально.
Из любой строки кода в вашей системе вы можете получить:
mod1 = somepackage.SomeModule(); // couple to me!
Вот краткий пример JS, но эта идея применима и к другим языкам.
function A () { // couple to me!
return { foo: "bar" };
};
(function () {
function B () { // don't couple to me!
function c () { // really don't couple to me!
return "buzz";
};
return { fizz: c() }; // 0 scope lookup
};
var a = A(); // 1 scope lookup
var b = B(); // 0 scope lookup
})();
var a1 = A(); // 0 scope lookup
var b1 = B(); // B is not defined
Поскольку глобальные переменные считаются вредными, насколько следует ограничивать видимость функций/классов? Каковы компромиссы?
Мой вопрос несколько мотивирован: 'когда допустимы глобальные переменные', 'альтернативы глобальным переменным' и 'возврат глобальных переменных'
Спасибо!