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) ?

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

nerv_ 20.12.2011 00:23

Цитата:

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

Я думаю, в контексте анонимной функции.

Livanderiaamarum 20.12.2011 00:25

Сразу же - это сразу же, она не добавляется в конец стека, а просто вызывается.
----------------------
как такое возможно? если мы внутри неё создадим вызов, а в них еще 20, создастся второй стек где будут хранится вызовы из анонимной? нет, как тогда хранить то если мы что-то вызовим внутри анонимной. ГДЕ хранить если не в стеке вызовов.

melky 20.12.2011 00:26

Цитата:

Сообщение от Livanderiaamarum (Сообщение 144596)
если наша анонимная вызывает что-то, а то в свою очередь тоже вызывает что-то, то СТЕК ВЫЗОВОВ НЕ ОСТАЕТСЯ НЕИЗМЕННЫМ!!!

??? стек вызовов показывает, откуда была вызвана функция. длина соотв. меняется.

Цитата:

Сообщение от Livanderiaamarum (Сообщение 144596)
а мне сказали что остается. как тогда компьютер узнает что нужно притормозить,

похоже, ты хотел сказать, "как тогда реализуются замыкания?".

Цитата:

Сообщение от Livanderiaamarum (Сообщение 144596)
и как узнает от куда потом нужно продолжить код если я сделаю вызовы внутри анонимной то где будет хранится список этих вызовов и.т.п. если он не создается то как компьютер будет запоминать что что вызвали и куда что возвращать?

доказывай "от противного", если не получается доказывать прямым ходом.

melky 20.12.2011 00:29

Цитата:

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

почему же? она доавится в стек.
и она не просто вызывается. она вызывается, когда исполнится блок кода, который исполняется в текущий момент (псевдоасинхронные ф-и - таймауты, event handlers)

Livanderiaamarum 20.12.2011 00:32

Цитата:

Сообщение от melky (Сообщение 144602)
почему же? она доавится в стек.
и она не просто вызывается. она вызывается, когда исполнится блок кода, который исполняется в текущий момент (псевдоасинхронные ф-и - таймауты, event handlers)

правильно:) а вот нотка говорит что нет;)

trikadin 20.12.2011 00:37

Цитата:

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

Ну, обычно там есть ф-ции)

Цитата:

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

nerv_, я стараюсь писать без ошибок, поэтому мои слова нужно понимать так, как я их написал.

Livanderiaamarum, возможно, понимание облегчит (а может, усложнит :D) такой пример:
var func_global; // предпочитаю объявлять заранее
(function(){
 var variable_local=3;
 var func_local= function(){ alert(variable_local)};
 func_global= function(){func_local()};
})()
func_global();
alert(variable_local);

trikadin 20.12.2011 00:38

Я немного не в тему, прошу простить. Интернет отрубился как раз в тот момент, когда я нажал кнопку "Отправить"...

trikadin 20.12.2011 00:40

Цитата:

Сообщение от Livanderiaamarum
правильно а вот нотка говорит что нет

У вас удивительный талант понимать людей.

nerv_ 20.12.2011 00:44

Цитата:

Сообщение от trikadin
nerv_, я стараюсь писать без ошибок, поэтому мои слова нужно понимать так, как я их написал.

trikadin, тогда получается с Ваших слов, что тут есть замыкание
(function() {
// код
})();

Хотя чего спорить, все зависит от
//код
:D

Livanderiaamarum 20.12.2011 00:46

Цитата:

Сообщение от trikadin (Сообщение 144612)
Ну, обычно там есть ф-ции)


nerv_, я стараюсь писать без ошибок, поэтому мои слова нужно понимать так, как я их написал.

Livanderiaamarum, возможно, понимание облегчит (а может, усложнит :D) такой пример:
var func_global; // предпочитаю объявлять заранее
(function(){
 var variable_local=3;
 var func_local= function(){ alert(variable_local)};
 func_global= function(){func_local()};
})()
func_global();
alert(variable_local);

хера се)) круто же) девушке завтра это покажу) она шарит у меня более менее) ща спит уже)) не думал что так можно.. я серьезно:)
так, я как не странно почти понял что произошло.

кажется каждая функция расширяет область видимости... вверх стека... вплоть до variable_local ? это как бы восходящее кверху стека замыкание?:)

trikadin 20.12.2011 00:49

Цитата:

Сообщение от Livanderiaamarum
кажется каждая функция расширяет область видимости... внутрь стека? это как бы восходящее кверху стека замыкание?

Я сейчас дзен поймаю. Ты что написал вообще?

У каждой ф-ции есть своя область видимости. Любая переменная, объявленная в ней с ключевым словом var, будет локальной и недоступной для внешних ф-ций. Поиск переменной происходит сначала в локальной области, потом - в локальной области внешней ф-ции (если есть) и т.д., пока не дойдём до global object. Если и в global object нету - то Referrence error.

Что тут не понятного?

Livanderiaamarum 20.12.2011 00:49

Цитата:

Сообщение от nerv_ (Сообщение 144616)
trikadin, тогда получается с Ваших слов, что тут есть замыкание
(function() {
// код
})();

Хотя чего спорить, все зависит от
//код
:D

скажу вам одну тайну, профессианалы вроде меня знают это, щас серьезно, на заметку.
ВСЕ функции в js ВСЕГДА создают замыкания))

Livanderiaamarum 20.12.2011 00:51

Цитата:

Сообщение от trikadin (Сообщение 144619)
Я сейчас дзен поймаю. Ты что написал вообще?

У каждой ф-ции есть своя область видимости. Любая переменная, объявленная в ней с ключевым словом var, будет локальной и недоступной для внешних ф-ций. Поиск переменной происходит сначала в локальной области, потом - в локальной области внешней ф-ции (если есть) и т.д., пока не дойдём до global object. Если и в global object нету - то Referrence error.

Что тут не понятного?

это тебе что-то непонятно)) мне все понятно) только я не понял вообще что ты написал, вернее я не понял как это относится к твоему коду и вообще к теме разговора. если ты не знаешь то замыкания это когда скоп копируется. есть низсходящие замыкания, есть восходящие. в данном случае восходящее. скоп расширен вверх. что, незнакомо)? А вроде Резинга читают тут все...

melky 20.12.2011 00:52

Цитата:

Сообщение от Livanderiaamarum (Сообщение 144618)
кажется каждая функция расширяет область видимости... вверх стека... вплоть до variable_local ? это как бы восходящее кверху стека замыкание?:)

нет замыкание - скоп оборачивающей анонимной функции. и никуда оно не восходит. но в стеке будет 3 функции.

trikadin 20.12.2011 00:53

Цитата:

Сообщение от Livanderiaamarum
это тебе что-то непонятно)) мне все понятно)

А чего спрашиваешь тогда?

Livanderiaamarum 20.12.2011 00:55

Цитата:

Сообщение от trikadin (Сообщение 144623)
А чего спрашиваешь тогда?

просто:) ^__^ скучно же сидеть просто так) топик интересный создал вот)

Livanderiaamarum 20.12.2011 00:57

Цитата:

Сообщение от melky (Сообщение 144622)
нет замыкание - скоп оборачивающей анонимной функции. и никуда оно не восходит. но в стеке будет 3 функции.

восходит это имеется ввиду расширяется область снизу стека или сверху)
в данном случае расширенна вверх стека), называется восходящее)

nerv_ 20.12.2011 00:59

Цитата:

Сообщение от Livanderiaamarum
так, я как не странно почти понял что произошло.

А я не понял. Можно специально для таких, как я?)
Это замыкание в замыкании? :) Вроде нет. Судя по всему функция обертка расширяет область видимости.
Я говорю вот об этом
var func_global; // предпочитаю объявлять заранее
(function() {
	 var variable_local = 3;
	 var func_local = function() { alert(variable_local); };
	 func_global = function() { func_local(); }; // здесь
})();
func_global();
alert(variable_local);

Livanderiaamarum 20.12.2011 01:00

Цитата:

Сообщение от nerv_ (Сообщение 144627)
А я не понял. Можно специально для таких, как я?)
Это замыкание в замыкании? :)

да)

melky 20.12.2011 01:11

Цитата:

Сообщение от Livanderiaamarum (Сообщение 144628)
да)

нет.

variable_local берётся из сохранённой области видимости корневой функции (самая первая - т.е. анонимная оборачивалка).

т.к. возможно я изрекаюсь слишком заумно, поэтому я кидаю картинку.



PS как мне нравится эта картинка троллфейса.

Livanderiaamarum 20.12.2011 01:17

Цитата:

Сообщение от melky (Сообщение 144633)
нет.

variable_local берётся из сохранённой области видимости корневой функции (самая первая - т.е. анонимная оборачивалка).

т.к. возможно я изрекаюсь слишком заумно, поэтому я кидаю картинку.



PS как мне нравится эта картинка троллфейса.

точно) я прост невнимательно посмотрел.

Livanderiaamarum 20.12.2011 01:18

Цитата:

Сообщение от melky (Сообщение 144633)
PS как мне нравится эта картинка троллфейса.

а у меня батхерд с неё((

Nekromancer 20.12.2011 11:42

Цитата:

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

(function a(){
alert(1);
})();
a();

Так тоже монжо :) Особенно в strict mode так даже правильнее :)

trikadin 20.12.2011 12:22

Цитата:

Сообщение от Nekromancer
Так тоже монжо Особенно в strict mode так даже правильнее

Да я не против)

Nekromancer 20.12.2011 12:50

trikadin,
Ну ты сказал, что она анонимная потому, что у неё нет имени и она потому не засоряет глобальную область.
Она действительно анонимная потому, что имени нету, но не засоряет не потому :)

Иваннн 20.12.2011 13:17

Некромансер., Соглано ecmascript 5.1 идентификатор функции как выражения создается в Lexical enviroment (созданном как часть контекста исполнения выражения (не кода) функции) и по идее не должен быть виден из вне, но твой пример мне не понятен, почему видна "a"!!!! Кстати согласно все то же спецификации
var s=function a(){}

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

Nekromancer 20.12.2011 13:37

"a" как раз таки не видна - "error: a is not defined". "a" видна только внутри функции "a", что позволяет использовать её ещё раз внутри вызова - рекурсия. Вместо arguments.callee.

Иваннн 20.12.2011 13:40

Все понял, я упустил, что функция в скобках и первый алерт - ее.

nerv_ 20.12.2011 13:43

Цитата:

Сообщение от Иваннн
но твой пример мне не понятен, почему видна "a"

Я бы лучше спросил, почему она не видна) Результаты вызовов: FF8/Opera10.62 - 1; "error: a is not defined"; IE8 - 1; 1.

Nekromancer 20.12.2011 13:47

nerv_,
http://dmitrysoshnikov.com/ecmascrip...expression-nfe
Внизу написано про баги реализации от Microsoft.


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