Иногда бывает удобно создать функцию только ради того, чтобы получить объ_ ект вызова, который действует как временное пространство имен, где можно оп_
1 Этот раздел содержит материал повышенной сложности, который при первом прочтении можно пропустить.
8.8. Область видимости функций и замыкания
ределять переменные и свойства, не беспокоясь о возможных конфликтах с гло_ бальным пространством имен. Предположим, для примера, что имеется файл с программным кодом на языке JavaScript, который необходимо использовать в разных JavaScript_программах (или, если дело касается клиентского языка JavaScript, на разных веб_страницах). Допустим, что в этом коде, как и любом другом, определяются переменные, предназначенные для хранения промежу_ точных результатов вычислений. Проблема заключается в следующем: посколь_ ку этот код будет использоваться в разных программах, в нем могут определять_ ся переменные с именами, конфликтующими с именами, определяемыми в са_ мих программах.
Чтобы избежать подобных конфликтов, импортируемый код можно поместить внутрь функции и затем обращаться к ней. Благодаря этому переменные будут определяться внутри объекта вызова функции:
function init( ) {
// Здесь располагается импортируемый программный код.
// Любые объявленные переменные станут свойствами объекта вызова,
// тем самым будет исключена вероятность конфликтов
// с глобальным пространством имен.
}
init( ); // Не забудьте вызвать функцию!
Этот фрагмент добавляет единственное свойство в глобальное пространство имен – свойство init, которое ссылается на функцию. Если даже добавление единствен_ ного свойства покажется вам излишним, можно определить и вызвать аноним_ ную функцию в одном выражении. Вот фрагмент, который работает именно та_ ким образом:
(function( ) { // Это безымянная функция.
// Здесь располагается импортируемый программный код. Любые
// объявленные переменные станут свойствами объекта вызова, тем самым
// исключается вероятность конфликтов с глобальным пространством имен. })(); // конец функционального литерала и его вызов.
Обратите внимание на круглые скобки, окружающие функциональный лите_ рал, – этого требует синтаксис JavaScript.