Конструкция ()()
Здравствуйте!
Многие js-библиотеки заключены в такую конструкцию: (function(){ // код })(); Очень хочется понять, что эта конструкция даёт? С удовольствием бы воспользовался поиском - но не знаю что искать "()()" ? :) Спасибо за ранее. |
Это анонимная функция. Создается для того, чтобы не загрязнять глобальное пространство имен.
var y = 22; (function(){ var x = 51; })(); alert([typeof y,typeof x]); |
От загрязнения она каким образом спасает? Спасает var - это понятно. В то же время определение переменной без var также происходит в контексте window..
var y = 22; (function(){ x = 51; })(); alert([typeof y,typeof x]); Ни панятна.. Можете пояснить? |
|
Цитата:
|
RobertoCavali, сбавьте тон, это же основы, читайте теорию.
В JavaScript только функции создают свою область видимости переменных: var x; // доступна везде function f() { var y; // доступна только внутри f } f(); Чтобы в глобальную область видимости не попали переменные, используемые только библиотекой, её полностью оборачивают в функцию, которую сразу же выполняют: function f() { var … // переменные, используемые только библиотекой } f(); В JavaScript есть несколько видов функций. Для FunctionExpression не обязательно указывать имя функции, но чтобы интерпретатор воспринял её, как FE, нужно какое-то выражение, например присваивание: var f = function () { var … // переменные, используемые только библиотекой }; f(); Но тут опять же в глобальной области видимости будет ненужная переменная f. Поэтому используют выражение группировки (скобочки), результатом выполнения которого будет ссылка на только что созданную анонимную функцию: alert(typeof (function () {})) которую можно сразу же вызвать: (function () { var … // переменные, используемые только библиотекой })(); (alert)(1); (function () { alert(2) })(); (function () { alert(3) }()); +function () { alert(4) }(); |
Octane,
с удовольствием общаюсь в нормальном тоне, когда люди адекватные. Спасибо за ответ - благодаря ему я получил ответ на свой вопрос. С пониманием и практикой использования контекста, пространства имен - проблем нет. Просто было неясно, зачем обертывать в ()(), ведь с тем же успехом может использоваться и обычная "именная" функция или вообще функция может быть основой класса (функция-конструктор). В любом случае в обертываемом коде скорее всего будут функции с названиями объявляемые в рамках глобального контекста - как правило это задача библиотек предоставлять функционал. Просто ()() - более изящно, как я понял. Поправьте, пожалуйста, если я не прав. |
При использовании (function () {…})() в глобальной области не будет ненужной ссылки на функцию, которую нужно было вызвать всего один раз.
|
Цитата:
|
Часовой пояс GMT +3, время: 22:56. |