Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.12.2011, 23:25
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 10.12.2011
Сообщений: 290

(function(){бла-бла-бла})() что это означает?
(function(){  /*код*/  })()


что такое замыкания я знаю. часто вижу такую конструкцию. как она работает?

как думаю я:
первые скобки возвращают то, что находится в них. функцианальное выражение. потом оператор вызова () применяется к тому что вернули скобки. иными словами ПРОСТО создается функция и просто вызывается. ни какого замыкания нет.

а как а самом деле? что происходит? с контекстами, со стеками вызовов и.т.п.

Последний раз редактировалось Livanderiaamarum, 19.12.2011 в 23:27.
Ответить с цитированием
  #2 (permalink)  
Старый 19.12.2011, 23:33
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

А в той теме, где я написал это, слабо было спросить?

Создаётся функция, в которой можно создавать локальные переменные, со своим скопом и т.д., в общем, ведущая себя как обычная ф-ция, и сразу же вызывается. Сразу же - это сразу же, она не добавляется в конец стека, а просто вызывается. Фактически, такая конструкция равносильна коду:

var func= function(){ };
func();


С одной разницей, ф-ция - анонимна, у неё нет имени, а значит, она не засоряет глобальную область видимости.

P. S.
Сообщение от Livanderiaamarum
ни какого замыкания нет.
Таки есть)
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #3 (permalink)  
Старый 19.12.2011, 23:37
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 10.12.2011
Сообщений: 290

Сообщение от trikadin Посмотреть сообщение
Сразу же - это сразу же, она не добавляется в конец стека, а просто вызывается.
Как так? О_О что со стеком происходит? очень интересно...
Функция тормозит код который ниже неё?разобрался, выполняется в стеке функции в которой написана. выполняется как выражение.

как я понимаю это просто функцианальное выражение вызванное, но не сохраненное ни где, оно исчезает после того как выполнит свою работу (работа остается, функция исчезает), так как на неё не хранится ни одной ссылки? и оно как и любая функция создает замыкание?)

тогда такой вопрос, если в ней я буду делать такие же функции, или объявлю в ней что-то, да даже не так, даже возьму и создам в ней 20 контекстов. где они будут хранится)?

Последний раз редактировалось Livanderiaamarum, 19.12.2011 в 23:52.
Ответить с цитированием
  #4 (permalink)  
Старый 19.12.2011, 23:51
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Livanderiaamarum
ни какого замыкания нет.
Сообщение от trikadin
Таки есть)
Есть замыкание? Или это следует читать как "так и есть"?)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #5 (permalink)  
Старый 19.12.2011, 23:53
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418


wikipedia


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

Сообщение от Livanderiaamarum Посмотреть сообщение
потом оператор вызова () применяется к тому что вернули скобки. иными словами ПРОСТО создается функция и просто вызывается. ни какого замыкания нет.
никакого замыкания нет, пока эта функция не инкапсулирует какую-нибудь функцию, которая будет использовать локальные переменные из родительской.

с замыканием :
(function () {
     var myvar;// переменная родительской [[scope]] 
     window.func = function(){ 
          alert(myvar) // использует переменную род. [[scope]]
     }
})();

func(); // undefined.

без :
(function () {
     window.func = function(){ 
          var myvar; // переменная [[scope]] этой функции
          alert(myvar) // использует переменную [[scope]] этой функции.
     }
})();

func(); //undefined.


Сообщение от Livanderiaamarum Посмотреть сообщение
с контекстами
по-умолчанию this равен window. у этой функции кто-то изменил контекст (call,apply) или она является методом/конструктором объекта, созданного с помощью new?

Сообщение от Livanderiaamarum Посмотреть сообщение
со стеками вызовов и.т.п.
функцию вызывает какая-то другая функция?


Livanderiaamarum, дружок, почитай про JavaScript шаблоны. уверен, тебе понравится.

Последний раз редактировалось melky, 19.12.2011 в 23:59.
Ответить с цитированием
  #6 (permalink)  
Старый 19.12.2011, 23:57
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 10.12.2011
Сообщений: 290

функцию вызывает какая-то другая функция?
--------------
да, вызывает её верх стека, точнее ТО в чем она написана.
Ответить с цитированием
  #7 (permalink)  
Старый 19.12.2011, 23:57
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

melky, спасибо. Хоть басурманским не владею, но нашел нужный код по приведенной ссылке)
Сообщение от Livanderiaamarum
функцию вызывает какая-то другая функция?
--------------
да, вызывает её верх стека, точнее ТО в чем она написана.
global object - это объект, а не функция)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #8 (permalink)  
Старый 20.12.2011, 00:02
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 10.12.2011
Сообщений: 290

Сообщение от nerv_ Посмотреть сообщение
melky, спасибо. Хоть басурманским не владею, но нашел нужный код по приведенной ссылке)

global object - это объект, а не функция)
спаисбо кэп. чтобы вам было понятно я сделаю другой пример.


function w()
{
     (function(){
         //действия 1

         //а если я тут сделаю вызов??
         alert()//например
         //функция алерт в каком контексте будет выполняться? в глобальном.
         //а после выполнения этого выражения продолжется выполнение  с верхушки стека? (на данный момент global=>w)
         //тогда так а если мы тут захотим создать кучу вызовов, где они будут записываться? создастся еще один стек?
         //нет, а как тогда?
     })()
     
   //действия 2
}

w()



в данном случае функцианальное выражение выполняется в контексте
global=>w

Последний раз редактировалось Livanderiaamarum, 20.12.2011 в 00:09.
Ответить с цитированием
  #9 (permalink)  
Старый 20.12.2011, 00:06
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Livanderiaamarum Посмотреть сообщение
Функция тормозит код который ниже неё?
JS - однопоточный язык. функция вызвана "асинхронно" (Timeout, event handler) ?
Ответить с цитированием
  #10 (permalink)  
Старый 20.12.2011, 00:18
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 10.12.2011
Сообщений: 290

Сообщение от melky Посмотреть сообщение
JS - однопоточный язык. функция вызвана "асинхронно" (Timeout, event handler) ?
спасибо кэп. суть в том что исходя из того чт о стек вызовов ОТВАЕТСЯ НЕИЗМЕННЫМ то получается что если наша анонимная вызывает что-то, а то в свою очередь тоже вызывает что-то, то СТЕК ВЫЗОВОВ НЕ ОСТАЕТСЯ НЕИЗМЕННЫМ!!! а мне сказали что остается. как тогда компьютер узнает что нужно притормозить, и как узнает от куда потом нужно продолжить код если я сделаю вызовы внутри анонимной то где будет хранится список этих вызовов и.т.п. если он не создается то как компьютер будет запоминать что что вызвали и куда что возвращать?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
wtf javascript vflash Оффтопик 53 14.11.2011 01:44
Что означает такой вызов? ksa jQuery 0 21.12.2010 13:45
DST что это? zzz Общие вопросы Javascript 3 11.08.2009 19:38
Сторонние библиотеки - быть или не быть? IIIEPJIOK Оффтопик 64 21.03.2009 19:39
Что означает конструкция ? ivanmara Общие вопросы Javascript 55 07.01.2009 02:54