Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   apply и call. В чём отличия? (https://javascript.ru/forum/offtopic/5156-apply-i-call-v-chjom-otlichiya.html)

B~Vladi 23.09.2009 12:27

Цитата:

Сообщение от Dmitry A. Soshnikov
А в чём проблема? Переменные не "сохраняются" во вложенной функции? Не видны? Или что?

Сохраняются... Но с ними сохраняется и [[scope]] конструктора... И их столько, сколько и объектов, созданных этим конструктором... Просто хочу убрать лишний мусор...
На примере такого кода:
function constructor(){
  var _this=this;
  var div=document.createElement('div');
  div.onclick=function(){
    _this.onClick();
  }
}

Т.е. я пытаюсь поставить обработчик так, чтобы this в методе объекта указывал на сам этот объект...
Есть, конечно, другой способ, но там приходиться бегать по DOM, а это уже минус в производительности и намного сложнее...

ЗЫ: Многие могу посчитать меня параноиком:D

Dmitry A. Soshnikov 23.09.2009 13:14

Цитата:

Сообщение от B~Vladi
Но с ними сохраняется и [[scope]] конструктора... И их столько, сколько и объектов, созданных этим конструктором... Просто хочу убрать лишний мусор...

Нет, так нельзя.

B~Vladi 23.09.2009 13:27

Цитата:

Сообщение от Dmitry A. Soshnikov
Нет, так нельзя.

Да уж, это я уже понял:)
Значит придёться терпеть...

Dmitry A. Soshnikov 23.09.2009 13:34

Цитата:

Сообщение от B~Vladi
Значит придёться терпеть...

Так а что терпеть? =) В других реализациях думаете не сохраняется весь лексический контекст при замыканиях? Сохраняется. Просто this в JS не замыкается в отличии от некоторых других реализаций замыканий (например, в Ruby), а определяется динамически выражением вызова при входе в контекст. Приходится писать вручную var _this = this.

B~Vladi 23.09.2009 14:47

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

})()

А оказалось, что всё равно внешний scope сохраняется, даже если в ней не используются переменные из этого scope...
Пора бы уже придумать супермега язык, который бы не ограничивал кодера синтаксисом... Интересно, много таких "попыток"?:)

B~Vladi 23.09.2009 16:05

Во! Круто! То, что надо! Спс, Dmitry A. Soshnikov, за статью, особенно за последний листинг из раздела прототип.:dance:
Вот читаю и понимаю, что не знал вообще ничего;)

x-yuri 23.09.2009 17:33

Цитата:

Сообщение от Dmitry A. Soshnikov
Но с ними сохраняется и [[scope]] конструктора... И их столько, сколько и объектов, созданных этим конструктором... Просто хочу убрать лишний мусор...

Нет, так нельзя.

от [[scope]] конструктора вроде ж можно избавиться, но не стоит
function constructor(){
  var div=document.createElement('div');
  div.onclick = (new Function( 'o', 'return function() { o.onClick(); }'))( this );
}

UPD: еще вариант - вынести функцию из конструктора :)

Dmitry A. Soshnikov 23.09.2009 17:56

Цитата:

Сообщение от B~Vladi
Спс, Dmitry A. Soshnikov, за статью

Рад, если оказалось полезным.

Цитата:

Сообщение от x-yuri
от [[scope]] конструктора вроде ж можно избавиться, но не стоит

А в этом плане - да. Хороший, пример, кстати, применения этой особенности new Function. Только избавиться не от [[Scope]] конструктора, а от Scope контекста конструктора, привыкаем сразу правильно называть ;)

Dmitry A. Soshnikov 23.09.2009 20:40

Цитата:

Сообщение от x-yuri
(new Function( 'o', 'return function() { o.onClick(); }'))( this );

Правда, здесь есть одна особенность. Если в случаях с декларациями функций и функциями-выражениями, по стандарту, можно думать, что там будет сделана оптимизация с объединёнными объектами, то в случае с new Function всегда будет создан новый объект-функция.

B~Vladi 24.09.2009 10:35

Цитата:

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

ОК:)


Часовой пояс GMT +3, время: 07:17.