05.12.2011, 19:40
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Kolyaj, devote, век живи - век учись) Но тогда я тоже хочу уточнить, почему не происходит накопления скопов. Казалось бы, такое поведение было бы достаточно логичным...
devote, я доверяю вашему опыту, но хотелось бы узнать чуть больше о теории - почему именно этого не происходит)
|
|
05.12.2011, 19:49
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от trikadin
|
почему именно этого не происходит)
|
Все очень логично, думать долго не нужно... при подобном использовани:
setTimeout(function blah(){
// ...
setTimeout(blah, 1);
}, 1);
Ты передаешь таймеру ссылку на функцию которая не находиться внутри текущего scope, интерпретатор это видит и не сохраняет scope предыдущей функции, если же интерпретатор видит такую конструкцию:
setTimeout(function blah(){
// ...
setTimeout(function(){
blah();
}, 1);
}, 1);
Он будет вынужден сохранить scope вызвавшей его функции, так как передана не ссылка а функция, которая находиться в области видимости предыдущей функции... И думать тут не нужно, интерпретатор не дураки писали, и понимали что нет смысла хранить scope в случаях что я указал в первом примере.
Последний раз редактировалось devote, 05.12.2011 в 19:52.
|
|
05.12.2011, 20:10
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
devote, а так?
setTimeout(function blah(){
var i=0;// например
setTimeout(blah, 1);
}, 1);
И кстати - у меня ваш пример из консоли не запустился в ff8.
|
|
05.12.2011, 20:21
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от trikadin
|
devote, а так?
|
Тоже scope удалится, нет смысла его хранить. Написал же, ссылка не может получить доступ к scope из которой ее вызвали.
Сообщение от trikadin
|
И кстати - у меня ваш пример из консоли не запустился в ff8.
|
Он будет работать в strict mode так как функцию с именем, в обычном режиме не поюзаешь. Надо примерно так:
function blah(){
// ....
setTimeout( blah, 1 );
}
setTimeout( blah, 1 );
scope сохраняется лишь в том случае, если внутри этой функции была создана другая функция, которой возможно нужно будет обратиться к scope своего потомка. Но только до того как ссылка на функцию не будет утерена.
|
|
05.12.2011, 20:26
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Сообщение от devote
|
Он будет работать в strict mode так как функцию с именем, в обычном режиме не поюзаешь.
|
Как переводить в строгий режим? Имеется в виду доктайп?
|
|
05.12.2011, 20:30
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
приведу пример
function blah(){
var a = 1;
// scope этой функции будет храниться до тех пор, пока
document.body.onclick = function(){ // эта функция имеет жизнь
// как только эта функция потеряет связь с миром, все scope будут удалены
}
}
например scope функции blah() будет храниться до тех пор, пока ее внутренний объект(функция) имеет связь с чем-то либо, тоесть в наше случае ссылка на нее висит у объекта BODY, если потеряю ссылку, тоесть выполню где-то:
document.body.onclick = null;
то scope верхней функции будет уничтожен сборщиком мусора.
|
|
05.12.2011, 20:30
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от trikadin
|
Как переводить в строгий режим? Имеется в виду доктайп?
|
MDN
"use strict";
// наш код..
|
|
05.12.2011, 20:31
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от trikadin
|
Как переводить в строгий режим? Имеется в виду доктайп?
|
function blah() {
"use strict"; // - переключили в строгий режим
// ...
}
|
|
05.12.2011, 20:55
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Как много я всего не знаю ещё)
devote, я понимаю, как работает механизм замыканий) Непонятки были только с тем моментом...
|
|
07.12.2011, 19:33
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Большое всем спасибо
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
|
|