(function(){бла-бла-бла})() что это означает?
(function(){ /*код*/ })() что такое замыкания я знаю. часто вижу такую конструкцию. как она работает? как думаю я: первые скобки возвращают то, что находится в них. функцианальное выражение. потом оператор вызова () применяется к тому что вернули скобки. иными словами ПРОСТО создается функция и просто вызывается. ни какого замыкания нет. а как а самом деле?:stop: что происходит? с контекстами, со стеками вызовов и.т.п. |
А в той теме, где я написал это, слабо было спросить?
Создаётся функция, в которой можно создавать локальные переменные, со своим скопом и т.д., в общем, ведущая себя как обычная ф-ция, и сразу же вызывается. Сразу же - это сразу же, она не добавляется в конец стека, а просто вызывается. Фактически, такая конструкция равносильна коду: var func= function(){ }; func(); С одной разницей, ф-ция - анонимна, у неё нет имени, а значит, она не засоряет глобальную область видимости. P. S. Цитата:
|
Цитата:
как я понимаю это просто функцианальное выражение вызванное, но не сохраненное ни где, оно исчезает после того как выполнит свою работу (работа остается, функция исчезает), так как на неё не хранится ни одной ссылки? и оно как и любая функция создает замыкание?) тогда такой вопрос, если в ней я буду делать такие же функции, или объявлю в ней что-то, да даже не так, даже возьму и создам в ней 20 контекстов. где они будут хранится)? |
Цитата:
Цитата:
|
wikipedia Цитата:
Цитата:
с замыканием : (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, дружок, почитай про JavaScript шаблоны. уверен, тебе понравится. |
функцию вызывает какая-то другая функция?
-------------- да, вызывает её верх стека, точнее ТО в чем она написана. |
melky, спасибо. Хоть басурманским не владею, но нашел нужный код по приведенной ссылке)
Цитата:
|
Цитата:
function w() { (function(){ //действия 1 //а если я тут сделаю вызов?? alert()//например //функция алерт в каком контексте будет выполняться? в глобальном. //а после выполнения этого выражения продолжется выполнение с верхушки стека? (на данный момент global=>w) //тогда так а если мы тут захотим создать кучу вызовов, где они будут записываться? создастся еще один стек? //нет, а как тогда? })() //действия 2 } w() в данном случае функцианальное выражение выполняется в контексте global=>w |
Цитата:
|
Цитата:
|
Цитата:
|
Сразу же - это сразу же, она не добавляется в конец стека, а просто вызывается.
---------------------- как такое возможно? если мы внутри неё создадим вызов, а в них еще 20, создастся второй стек где будут хранится вызовы из анонимной? нет, как тогда хранить то если мы что-то вызовим внутри анонимной. ГДЕ хранить если не в стеке вызовов. |
Цитата:
Цитата:
Цитата:
|
Цитата:
и она не просто вызывается. она вызывается, когда исполнится блок кода, который исполняется в текущий момент (псевдоасинхронные ф-и - таймауты, event handlers) |
Цитата:
|
Цитата:
Цитата:
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); |
Я немного не в тему, прошу простить. Интернет отрубился как раз в тот момент, когда я нажал кнопку "Отправить"...
|
Цитата:
|
Цитата:
(function() { // код })(); Хотя чего спорить, все зависит от //код:D |
Цитата:
так, я как не странно почти понял что произошло. кажется каждая функция расширяет область видимости... вверх стека... вплоть до variable_local ? это как бы восходящее кверху стека замыкание?:) |
Цитата:
У каждой ф-ции есть своя область видимости. Любая переменная, объявленная в ней с ключевым словом var, будет локальной и недоступной для внешних ф-ций. Поиск переменной происходит сначала в локальной области, потом - в локальной области внешней ф-ции (если есть) и т.д., пока не дойдём до global object. Если и в global object нету - то Referrence error. Что тут не понятного? |
Цитата:
ВСЕ функции в js ВСЕГДА создают замыкания)) |
Цитата:
|
Цитата:
![]() |
Цитата:
|
Цитата:
|
Цитата:
в данном случае расширенна вверх стека), называется восходящее) |
Цитата:
Это замыкание в замыкании? :) Вроде нет. Судя по всему функция обертка расширяет область видимости. Я говорю вот об этом 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); |
Цитата:
|
|
точно) я прост невнимательно посмотрел.
|
Цитата:
|
Цитата:
(function a(){ alert(1); })(); a(); Так тоже монжо :) Особенно в strict mode так даже правильнее :) |
Цитата:
|
trikadin,
Ну ты сказал, что она анонимная потому, что у неё нет имени и она потому не засоряет глобальную область. Она действительно анонимная потому, что имени нету, но не засоряет не потому :) |
Некромансер., Соглано ecmascript 5.1 идентификатор функции как выражения создается в Lexical enviroment (созданном как часть контекста исполнения выражения (не кода) функции) и по идее не должен быть виден из вне, но твой пример мне не понятен, почему видна "a"!!!! Кстати согласно все то же спецификации
var s=function a(){} уже замыкание. Люди, я сам плохо понимаю логику языка, но чтобы пролить свет на нее нужно!!! читать спецификацию, частными примерами очень тяжело понять, что почему происходит. |
"a" как раз таки не видна - "error: a is not defined". "a" видна только внутри функции "a", что позволяет использовать её ещё раз внутри вызова - рекурсия. Вместо arguments.callee.
|
Все понял, я упустил, что функция в скобках и первый алерт - ее.
|
Цитата:
|
nerv_,
http://dmitrysoshnikov.com/ecmascrip...expression-nfe Внизу написано про баги реализации от Microsoft. |
Часовой пояс GMT +3, время: 19:04. |