Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.08.2010, 14:59
Интересующийся
Отправить личное сообщение для RobertoCavali Посмотреть профиль Найти все сообщения от RobertoCavali
 
Регистрация: 22.08.2010
Сообщений: 11

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

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

Очень хочется понять, что эта конструкция даёт? С удовольствием бы воспользовался поиском - но не знаю что искать "()()" ? Спасибо за ранее.
Ответить с цитированием
  #2 (permalink)  
Старый 22.08.2010, 15:40
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Это анонимная функция. Создается для того, чтобы не загрязнять глобальное пространство имен.
var y = 22;
(function(){
 var x = 51;
})();
alert([typeof y,typeof x]);
Ответить с цитированием
  #3 (permalink)  
Старый 23.08.2010, 00:19
Интересующийся
Отправить личное сообщение для RobertoCavali Посмотреть профиль Найти все сообщения от RobertoCavali
 
Регистрация: 22.08.2010
Сообщений: 11

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


Ни панятна.. Можете пояснить?
Ответить с цитированием
  #4 (permalink)  
Старый 23.08.2010, 00:46
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

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

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

Последний раз редактировалось B~Vladi, 23.08.2010 в 00:50.
Ответить с цитированием
  #5 (permalink)  
Старый 23.08.2010, 00:58
Интересующийся
Отправить личное сообщение для RobertoCavali Посмотреть профиль Найти все сообщения от RobertoCavali
 
Регистрация: 22.08.2010
Сообщений: 11

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

На, вот, почитай.
А ты не пиши, если ответить нечего. Судя по всему, ты "властью" наслаждаешься.
Ответить с цитированием
  #6 (permalink)  
Старый 23.08.2010, 01:13
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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, 23.08.2010 в 01:25.
Ответить с цитированием
  #7 (permalink)  
Старый 23.08.2010, 01:29
Интересующийся
Отправить личное сообщение для RobertoCavali Посмотреть профиль Найти все сообщения от RobertoCavali
 
Регистрация: 22.08.2010
Сообщений: 11

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

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

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

Последний раз редактировалось RobertoCavali, 23.08.2010 в 01:33.
Ответить с цитированием
  #8 (permalink)  
Старый 23.08.2010, 01:34
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

При использовании (function () {…})() в глобальной области не будет ненужной ссылки на функцию, которую нужно было вызвать всего один раз.
Ответить с цитированием
  #9 (permalink)  
Старый 23.08.2010, 01:44
Интересующийся
Отправить личное сообщение для RobertoCavali Посмотреть профиль Найти все сообщения от RobertoCavali
 
Регистрация: 22.08.2010
Сообщений: 11

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что за конструкция? (из jQuery) Yojik Общие вопросы Javascript 6 22.08.2010 15:46
Конструкция не пашет в функции , а в событии работает FRIE jQuery 1 05.03.2010 11:38
Не работает конструкция window.opener.close() goldfuzz Элементы интерфейса 3 23.08.2009 12:13
PHP-шная конструкция ${$var1.$var2}. А в яваскрипте? maxikuku Общие вопросы Javascript 5 16.06.2009 10:36
не понятная конструкция в JS scuter Общие вопросы Javascript 11 07.06.2008 14:07