23.09.2009, 12:27
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от Dmitry A. Soshnikov
|
А в чём проблема? Переменные не "сохраняются" во вложенной функции? Не видны? Или что?
|
Сохраняются... Но с ними сохраняется и [[scope]] конструктора... И их столько, сколько и объектов, созданных этим конструктором... Просто хочу убрать лишний мусор...
На примере такого кода:
function constructor(){
var _this=this;
var div=document.createElement('div');
div.onclick=function(){
_this.onClick();
}
}
Т.е. я пытаюсь поставить обработчик так, чтобы this в методе объекта указывал на сам этот объект...
Есть, конечно, другой способ, но там приходиться бегать по DOM, а это уже минус в производительности и намного сложнее...
ЗЫ: Многие могу посчитать меня параноиком
Последний раз редактировалось B~Vladi, 23.09.2009 в 12:30.
|
|
23.09.2009, 13:14
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Сообщение от B~Vladi
|
Но с ними сохраняется и [[scope]] конструктора... И их столько, сколько и объектов, созданных этим конструктором... Просто хочу убрать лишний мусор...
|
Нет, так нельзя.
|
|
23.09.2009, 13:27
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от Dmitry A. Soshnikov
|
Нет, так нельзя.
|
Да уж, это я уже понял
Значит придёться терпеть...
|
|
23.09.2009, 13:34
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Сообщение от B~Vladi
|
Значит придёться терпеть...
|
Так а что терпеть? =) В других реализациях думаете не сохраняется весь лексический контекст при замыканиях? Сохраняется. Просто this в JS не замыкается в отличии от некоторых других реализаций замыканий (например, в Ruby), а определяется динамически выражением вызова при входе в контекст. Приходится писать вручную var _this = this.
|
|
23.09.2009, 14:47
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Ну я надеялся как-то схитрить с конструкцией:
(function(){
})()
А оказалось, что всё равно внешний scope сохраняется, даже если в ней не используются переменные из этого scope...
Пора бы уже придумать супермега язык, который бы не ограничивал кодера синтаксисом... Интересно, много таких "попыток"?
|
|
23.09.2009, 16:05
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Во! Круто! То, что надо! Спс, Dmitry A. Soshnikov, за статью, особенно за последний листинг из раздела прототип.
Вот читаю и понимаю, что не знал вообще ничего
|
|
23.09.2009, 17:33
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от Dmitry A. Soshnikov
|
Но с ними сохраняется и [[scope]] конструктора... И их столько, сколько и объектов, созданных этим конструктором... Просто хочу убрать лишний мусор...
Нет, так нельзя.
|
от [[scope]] конструктора вроде ж можно избавиться, но не стоит
function constructor(){
var div=document.createElement('div');
div.onclick = (new Function( 'o', 'return function() { o.onClick(); }'))( this );
}
UPD: еще вариант - вынести функцию из конструктора
Последний раз редактировалось x-yuri, 23.09.2009 в 17:42.
|
|
23.09.2009, 17:56
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Сообщение от B~Vladi
|
Спс, Dmitry A. Soshnikov, за статью
|
Рад, если оказалось полезным.
Сообщение от x-yuri
|
от [[scope]] конструктора вроде ж можно избавиться, но не стоит
|
А в этом плане - да. Хороший, пример, кстати, применения этой особенности new Function. Только избавиться не от [[Scope]] конструктора, а от Scope контекста конструктора, привыкаем сразу правильно называть
|
|
23.09.2009, 20:40
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Сообщение от x-yuri
|
(new Function( 'o', 'return function() { o.onClick(); }'))( this );
|
Правда, здесь есть одна особенность. Если в случаях с декларациями функций и функциями-выражениями, по стандарту, можно думать, что там будет сделана оптимизация с объединёнными объектами, то в случае с new Function всегда будет создан новый объект-функция.
|
|
24.09.2009, 10:35
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от Dmitry A. Soshnikov
|
привыкаем сразу правильно называть
|
ОК
|
|
|
|