Kolyaj, devote, век живи - век учись) Но тогда я тоже хочу уточнить, почему не происходит накопления скопов. Казалось бы, такое поведение было бы достаточно логичным...
devote, я доверяю вашему опыту, но хотелось бы узнать чуть больше о теории - почему именно этого не происходит) |
Цитата:
setTimeout(function blah(){ // ... setTimeout(blah, 1); }, 1);Ты передаешь таймеру ссылку на функцию которая не находиться внутри текущего scope, интерпретатор это видит и не сохраняет scope предыдущей функции, если же интерпретатор видит такую конструкцию: setTimeout(function blah(){ // ... setTimeout(function(){ blah(); }, 1); }, 1);Он будет вынужден сохранить scope вызвавшей его функции, так как передана не ссылка а функция, которая находиться в области видимости предыдущей функции... И думать тут не нужно, интерпретатор не дураки писали, и понимали что нет смысла хранить scope в случаях что я указал в первом примере. |
devote, а так?
setTimeout(function blah(){ var i=0;// например setTimeout(blah, 1); }, 1); И кстати - у меня ваш пример из консоли не запустился в ff8. |
Цитата:
Цитата:
function blah(){ // .... setTimeout( blah, 1 ); } setTimeout( blah, 1 );scope сохраняется лишь в том случае, если внутри этой функции была создана другая функция, которой возможно нужно будет обратиться к scope своего потомка. Но только до того как ссылка на функцию не будет утерена. |
Цитата:
|
приведу пример
function blah(){ var a = 1; // scope этой функции будет храниться до тех пор, пока document.body.onclick = function(){ // эта функция имеет жизнь // как только эта функция потеряет связь с миром, все scope будут удалены } } например scope функции blah() будет храниться до тех пор, пока ее внутренний объект(функция) имеет связь с чем-то либо, тоесть в наше случае ссылка на нее висит у объекта BODY, если потеряю ссылку, тоесть выполню где-то: document.body.onclick = null;то scope верхней функции будет уничтожен сборщиком мусора. |
Цитата:
"use strict"; // наш код.. |
Цитата:
function blah() { "use strict"; // - переключили в строгий режим // ... } |
Как много я всего не знаю ещё)
devote, я понимаю, как работает механизм замыканий) Непонятки были только с тем моментом... |
Большое всем спасибо :)
|
Часовой пояс GMT +3, время: 16:30. |