19.12.2011, 23:25
|
|
Профессор
|
|
Регистрация: 10.12.2011
Сообщений: 290
|
|
(function(){бла-бла-бла})() что это означает?
(function(){ /*код*/ })()
что такое замыкания я знаю. часто вижу такую конструкцию. как она работает?
как думаю я:
первые скобки возвращают то, что находится в них. функцианальное выражение. потом оператор вызова () применяется к тому что вернули скобки. иными словами ПРОСТО создается функция и просто вызывается. ни какого замыкания нет.
а как а самом деле? что происходит? с контекстами, со стеками вызовов и.т.п.
Последний раз редактировалось Livanderiaamarum, 19.12.2011 в 23:27.
|
|
19.12.2011, 23:33
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
А в той теме, где я написал это, слабо было спросить?
Создаётся функция, в которой можно создавать локальные переменные, со своим скопом и т.д., в общем, ведущая себя как обычная ф-ция, и сразу же вызывается. Сразу же - это сразу же, она не добавляется в конец стека, а просто вызывается. Фактически, такая конструкция равносильна коду:
var func= function(){ };
func();
С одной разницей, ф-ция - анонимна, у неё нет имени, а значит, она не засоряет глобальную область видимости.
P. S.
Сообщение от Livanderiaamarum
|
ни какого замыкания нет.
|
Таки есть)
|
|
19.12.2011, 23:37
|
|
Профессор
|
|
Регистрация: 10.12.2011
Сообщений: 290
|
|
Сообщение от trikadin
|
Сразу же - это сразу же, она не добавляется в конец стека, а просто вызывается.
|
Как так? О_О что со стеком происходит? очень интересно...
Функция тормозит код который ниже неё?разобрался, выполняется в стеке функции в которой написана. выполняется как выражение.
как я понимаю это просто функцианальное выражение вызванное, но не сохраненное ни где, оно исчезает после того как выполнит свою работу (работа остается, функция исчезает), так как на неё не хранится ни одной ссылки? и оно как и любая функция создает замыкание?)
тогда такой вопрос, если в ней я буду делать такие же функции, или объявлю в ней что-то, да даже не так, даже возьму и создам в ней 20 контекстов. где они будут хранится)?
Последний раз редактировалось Livanderiaamarum, 19.12.2011 в 23:52.
|
|
19.12.2011, 23:51
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от Livanderiaamarum
|
ни какого замыкания нет.
|
Сообщение от trikadin
|
Таки есть)
|
Есть замыкание? Или это следует читать как "так и есть"?)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
19.12.2011, 23:53
|
sinistral
|
|
Регистрация: 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.
|
|
19.12.2011, 23:57
|
|
Профессор
|
|
Регистрация: 10.12.2011
Сообщений: 290
|
|
функцию вызывает какая-то другая функция?
--------------
да, вызывает её верх стека, точнее ТО в чем она написана.
|
|
19.12.2011, 23:57
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
melky, спасибо. Хоть басурманским не владею, но нашел нужный код по приведенной ссылке)
Сообщение от Livanderiaamarum
|
функцию вызывает какая-то другая функция?
--------------
да, вызывает её верх стека, точнее ТО в чем она написана.
|
global object - это объект, а не функция)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
20.12.2011, 00:02
|
|
Профессор
|
|
Регистрация: 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.
|
|
20.12.2011, 00:06
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от Livanderiaamarum
|
Функция тормозит код который ниже неё?
|
JS - однопоточный язык. функция вызвана "асинхронно" (Timeout, event handler) ?
|
|
20.12.2011, 00:18
|
|
Профессор
|
|
Регистрация: 10.12.2011
Сообщений: 290
|
|
Сообщение от melky
|
JS - однопоточный язык. функция вызвана "асинхронно" (Timeout, event handler) ?
|
спасибо кэп. суть в том что исходя из того чт о стек вызовов ОТВАЕТСЯ НЕИЗМЕННЫМ то получается что если наша анонимная вызывает что-то, а то в свою очередь тоже вызывает что-то, то СТЕК ВЫЗОВОВ НЕ ОСТАЕТСЯ НЕИЗМЕННЫМ!!! а мне сказали что остается. как тогда компьютер узнает что нужно притормозить, и как узнает от куда потом нужно продолжить код если я сделаю вызовы внутри анонимной то где будет хранится список этих вызовов и.т.п. если он не создается то как компьютер будет запоминать что что вызвали и куда что возвращать?
|
|
|
|