Логин:

Пароль:

Форумы
Общие вопросы
Document Object Model
Обсуждаем конференцию
Web Usability (test)

Общие вопросы

От этого примера мне даже поплохело...

Прямо затмение на меня нашло. Давненько я не была в такой растерянности, да еще от столь простенького примера :-(
Показательно, что в этом примере оба обработчика формируются в момент onload, так что ПО МОИМ ПРОШЛЫМ ПРЕДСТАВЛЕНИЯМ переменная temp, к моменту кликанья мышкой, вроде бы уже и не должна существовать, ибо определена в блоке функции, которая к тому моменту давно выполнилась. И это ожидание в полной мере подтвердилось вызовом первого обработчика (там где new Function): переменная temp не обнаруживается и выдается сообщение об ошибке на странице.
Но когда я увидела, что второй обработчик по-прежнему "помнит" не только саму переменную temp, но и ее значение - я удивилась, но сперва не сильно. Решив, что наверное тело функции подверглось "компиляции" и потому я вижу то значение, которое было в тот момент. И какова была моя растеряность, когда модифицировав код таким образом :
{ var temp=2;
....
b2.onclick=function(){alert(temp++)}
}
я увидела невероятное! - Давным давно "умершая" переменная temp, при каждом клике исправно инкриментировалась на единичку! Выходило, что я преждевременно отпевала эту переменную. Она не только где-то живет, но и продолжает исправно выполнять свою роль, сохраняя в себе положенные в нее значения.
Из всего этого у меня сложилось впечатление, что все порождаемые в программе переменные вроде как неуничтожимы! А "неощущаются" лишь потому, что становятся невидимыми в другом контексте. Потому что вызов любой функции, определенной в том или ином контексте приводит к активизации того контекста (переменных), в котором они были определены. И при каждом вызове такой функции, ее тело обрабатывается именно в этом же самом контексте (окружении).
В то время как, тело функции, порождаемое из стринга объектом new Function("стринг"), повидимому воспринимается в том контексте, который существует в момент ВЫЗОВА такой функции, а не того контекста, в котором этот объект создавался.
Честно говоря даже не могу сказать твердо, сработал ли оператор new, породив объект Function с момент присвоения
b1.onclick=new Function("alert(temp)");
или же его создание происходит в момент клика...
Чувствую, что что-то здесь я недопоняла... Может найдется кто-то, кто бы мог растолковать яснее?
----
Pipa
СообщениеАвторДата
Pipa16.03.2003 23:27
Dworkin17.03.2003 12:43
Pipa17.03.2003 23:03
Pipa18.03.2003 05:11
гоша18.03.2003 13:43
Pipa18.03.2003 17:43
гоша18.03.2003 18:13
Pipa18.03.2003 20:25
гоша19.03.2003 14:48
Leechy18.03.2003 13:37