Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Конструкция ()() (https://javascript.ru/forum/misc/11409-konstrukciya.html)

RobertoCavali 22.08.2010 14:59

Конструкция ()()
 
Здравствуйте!
Многие js-библиотеки заключены в такую конструкцию:

(function(){
// код
})();

Очень хочется понять, что эта конструкция даёт? С удовольствием бы воспользовался поиском - но не знаю что искать "()()" ? :) Спасибо за ранее.

B@rmaley.e><e 22.08.2010 15:40

Это анонимная функция. Создается для того, чтобы не загрязнять глобальное пространство имен.
var y = 22;
(function(){
 var x = 51;
})();
alert([typeof y,typeof x]);

RobertoCavali 23.08.2010 00:19

От загрязнения она каким образом спасает? Спасает var - это понятно. В то же время определение переменной без var также происходит в контексте window..
var y = 22;
(function(){
x = 51;
})();
alert([typeof y,typeof x]);


Ни панятна.. Можете пояснить?

B~Vladi 23.08.2010 00:46

А ты не определяй без var. Судя по всему, тебе такая конструкция пока не нужна.

На, вот, почитай.

RobertoCavali 23.08.2010 00:58

Цитата:

Сообщение от B~Vladi (Сообщение 68276)
А ты не определяй без var. Судя по всему, тебе такая конструкция пока не нужна.

На, вот, почитай.

А ты не пиши, если ответить нечего. Судя по всему, ты "властью" наслаждаешься.

Octane 23.08.2010 01:13

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) }();

RobertoCavali 23.08.2010 01:29

Octane,
с удовольствием общаюсь в нормальном тоне, когда люди адекватные. Спасибо за ответ - благодаря ему я получил ответ на свой вопрос.

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

Просто ()() - более изящно, как я понял. Поправьте, пожалуйста, если я не прав.

Octane 23.08.2010 01:34

При использовании (function () {…})() в глобальной области не будет ненужной ссылки на функцию, которую нужно было вызвать всего один раз.

RobertoCavali 23.08.2010 01:44

Цитата:

Сообщение от Octane (Сообщение 68281)
При использовании (function () {…})() в глобальной области не будет ненужной ссылки на функцию, которую нужно было вызвать всего один раз.

Ясность предельная. Спасибо


Часовой пояс GMT +3, время: 08:27.