Цитата(Amphiluke @ 12.8.2010, 21:16 ) | А чем это не замыкание? Цепочка областей видимости анонимной функции, назначаемой свойству onreadystatechange, включает объект вызова внешней функции. Сборщик мусора не удалит переменную thisAlias, пока вложенная функция будет ссылаться на объект вызова. Нет? |
Извини, дорогой ... Для раздела "JavaScript для новичков" пример вполне дееспособный, но если мы говорим о более серьезном подходе, то вариант никудышний. Я молчу о том, что переменная thisAlias теоретически может быть переопределена на момент срабатывания хандлера - это, конечно же, маловероятно, но надежность кода страдает. А вот то, что анонимная функция, назначенная onreadystatechange, НИЧЕГО пока не знает о своей "начинке" - это факт достаточно известный , поэтому GC может и подчистить приватную переменную. В данном случае спасает (может спасать) только то, что внутренний GC в JavaScript срабатывает по таймеру, а ответ с сервера в примере приходит быстрее. Но согласись, это же не решение задачи - так работать на грани фола. Именно для этого и придумали замыкания - чтобы отдать значение доступной переменной внутреннему механизму, и дальше ее не трогать и позволить удалиться. Советую уделять более пристальное внимание надежности и универсальности кода.
Добавлено через 11 минут и 9 секунд
Цитата(drainme @ 13.8.2010, 08:08 ) | Большое спасибо за разъяснения, сам бы еще долго искал решение, но вот что интересно с моим прежним кодом" = this.handle_response", функция срабатывает(просто алерт вставил для теста), по поводу xmlhttpobject'a логично и тему можно закрывать, но почему this работает все-таки интересно |
Там где назначен this.handle_response, он существует, так как this в данном случае ссылается на объект типа http_request, то есть противоречий нет. А когда позже идет ссылка на this.request, то у handle_response такого свойства/функции нет. Можно получить через parent.request или обратиться просто через request - не стал пристально смотреть код и тестировать его, но думаю, это свойство (без this) будет доступно. |