Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #41 (permalink)  
Старый 23.09.2009, 12:27
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 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.
Ответить с цитированием
  #42 (permalink)  
Старый 23.09.2009, 13:14
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от B~Vladi
Но с ними сохраняется и [[scope]] конструктора... И их столько, сколько и объектов, созданных этим конструктором... Просто хочу убрать лишний мусор...
Нет, так нельзя.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #43 (permalink)  
Старый 23.09.2009, 13:27
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от Dmitry A. Soshnikov
Нет, так нельзя.
Да уж, это я уже понял
Значит придёться терпеть...
Ответить с цитированием
  #44 (permalink)  
Старый 23.09.2009, 13:34
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от B~Vladi
Значит придёться терпеть...
Так а что терпеть? =) В других реализациях думаете не сохраняется весь лексический контекст при замыканиях? Сохраняется. Просто this в JS не замыкается в отличии от некоторых других реализаций замыканий (например, в Ruby), а определяется динамически выражением вызова при входе в контекст. Приходится писать вручную var _this = this.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #45 (permalink)  
Старый 23.09.2009, 14:47
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Ну я надеялся как-то схитрить с конструкцией:
(function(){

})()

А оказалось, что всё равно внешний scope сохраняется, даже если в ней не используются переменные из этого scope...
Пора бы уже придумать супермега язык, который бы не ограничивал кодера синтаксисом... Интересно, много таких "попыток"?
Ответить с цитированием
  #46 (permalink)  
Старый 23.09.2009, 16:05
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Во! Круто! То, что надо! Спс, Dmitry A. Soshnikov, за статью, особенно за последний листинг из раздела прототип.
Вот читаю и понимаю, что не знал вообще ничего
Ответить с цитированием
  #47 (permalink)  
Старый 23.09.2009, 17:33
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 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.
Ответить с цитированием
  #48 (permalink)  
Старый 23.09.2009, 17:56
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от B~Vladi
Спс, Dmitry A. Soshnikov, за статью
Рад, если оказалось полезным.

Сообщение от x-yuri
от [[scope]] конструктора вроде ж можно избавиться, но не стоит
А в этом плане - да. Хороший, пример, кстати, применения этой особенности new Function. Только избавиться не от [[Scope]] конструктора, а от Scope контекста конструктора, привыкаем сразу правильно называть
__________________
Тонкости ECMAScript
Ответить с цитированием
  #49 (permalink)  
Старый 23.09.2009, 20:40
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от x-yuri
(new Function( 'o', 'return function() { o.onClick(); }'))( this );
Правда, здесь есть одна особенность. Если в случаях с декларациями функций и функциями-выражениями, по стандарту, можно думать, что там будет сделана оптимизация с объединёнными объектами, то в случае с new Function всегда будет создан новый объект-функция.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #50 (permalink)  
Старый 24.09.2009, 10:35
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от Dmitry A. Soshnikov
привыкаем сразу правильно называть
ОК
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск