Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   (function(){бла-бла-бла})() что это означает? (https://javascript.ru/forum/misc/24165-function-%7Bbla-bla-bla%7D-chto-ehto-oznachaet.html)

Livanderiaamarum 19.12.2011 23:25

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


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

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

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

trikadin 19.12.2011 23:33

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

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

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


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

P. S.
Цитата:

Сообщение от Livanderiaamarum
ни какого замыкания нет.

Таки есть)

Livanderiaamarum 19.12.2011 23:37

Цитата:

Сообщение от trikadin (Сообщение 144578)
Сразу же - это сразу же, она не добавляется в конец стека, а просто вызывается.

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

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

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

nerv_ 19.12.2011 23:51

Цитата:

Сообщение от Livanderiaamarum
ни какого замыкания нет.

Цитата:

Сообщение от trikadin
Таки есть)

Есть замыкание? Или это следует читать как "так и есть"?)

melky 19.12.2011 23:53


wikipedia


Цитата:

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

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

Цитата:

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

никакого замыкания нет, пока эта функция не инкапсулирует какую-нибудь функцию, которая будет использовать локальные переменные из родительской.

с замыканием :
(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 (Сообщение 144577)
с контекстами

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

Цитата:

Сообщение от Livanderiaamarum (Сообщение 144577)
со стеками вызовов и.т.п.

функцию вызывает какая-то другая функция?


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

Livanderiaamarum 19.12.2011 23:57

функцию вызывает какая-то другая функция?
--------------
да, вызывает её верх стека, точнее ТО в чем она написана.

nerv_ 19.12.2011 23:57

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

Сообщение от Livanderiaamarum
функцию вызывает какая-то другая функция?
--------------
да, вызывает её верх стека, точнее ТО в чем она написана.

global object - это объект, а не функция)

Livanderiaamarum 20.12.2011 00:02

Цитата:

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

global object - это объект, а не функция)

спаисбо кэп. чтобы вам было понятно я сделаю другой пример.


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

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

w()



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

melky 20.12.2011 00:06

Цитата:

Сообщение от Livanderiaamarum (Сообщение 144579)
Функция тормозит код который ниже неё?

JS - однопоточный язык. функция вызвана "асинхронно" (Timeout, event handler) ?

Livanderiaamarum 20.12.2011 00:18

Цитата:

Сообщение от melky (Сообщение 144591)
JS - однопоточный язык. функция вызвана "асинхронно" (Timeout, event handler) ?

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


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