Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 14.11.2012, 19:58
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Видите ли мой друг.


всех кто не хочет прописывать self в каждой функции кидают в бездонную яму. Кстатии зачем в каждой ?
Прописывайте только там где сочтёте это нужным.

Раньше когда вы использывали self у вас было замыкание и переменная хранилась в нём, а сейчас замыкания нет и self хранить негде.

максимум что можно, это передавать self в параметре, каждой фнкции.

Просто смеритесь, вы обречены
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 14.11.2012 в 20:05.
Ответить с цитированием
  #12 (permalink)  
Старый 14.11.2012, 20:08
Аспирант
Отправить личное сообщение для bFree Посмотреть профиль Найти все сообщения от bFree
 
Регистрация: 19.08.2008
Сообщений: 42

В итоге получается, что JS требует постоянного написания одинакового кода, который явно излишен. Печалька.

Если прописывать прямо в методах, то получаем дополнительный мусор в коде.

Кажется, этот вопрос решили в Coffeescript
Ответить с цитированием
  #13 (permalink)  
Старый 14.11.2012, 21:02
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от bFree
А придется это делать очень часто, т.к. постоянно работаю с jquery и другими фреймворками.
в jQuery почти везде можно передать контекст исполнения для обработчика ($.ajax точно, как помню)
Ответить с цитированием
  #14 (permalink)  
Старый 14.11.2012, 21:53
Аспирант
Отправить личное сообщение для bFree Посмотреть профиль Найти все сообщения от bFree
 
Регистрация: 19.08.2008
Сообщений: 42

Нет. Просто хочу, чтобы можно было в коллбеках использовать указатель на объект безо всяких .bind и других доп. конструкций.

Пример:
this.onClick = function() {
   // bla-bla-bla
}

this.bindEvent = function() {
   $("some element").on("click", function(e) {
       this.onClick(); // oh noooo!! тут this = объект jquery
       // чтобы работало, мне нужно перед аттачем евента сделать в методе var self = this и внутри юзать self.onClick
   }
}

А если таких методов у меня в классе много? Я не хочу в каждом таком месте писать одинаковую строчку.
Ответить с цитированием
  #15 (permalink)  
Старый 14.11.2012, 21:58
Аспирант
Отправить личное сообщение для bFree Посмотреть профиль Найти все сообщения от bFree
 
Регистрация: 19.08.2008
Сообщений: 42

iMaxmaxmaximus, я тебя понял. Замыкания действительно нет и self хранить негде.

Очень-очень жаль. Не люблю раздувать код одинаковыми конструкциями..
В coffescript это решено на уровне синтаксиса:
Код:
onClick: () -> 
  // bla-bla-bla

bindEvent: () ->
  $("some element").on "click" (e) => // => как раз позволяет передать this
    @onClick()
И из этого кофескрипт как раз соберет то, что я не хочу писать руками: var _this = this;
Ответить с цитированием
  #16 (permalink)  
Старый 14.11.2012, 22:08
Аспирант
Отправить личное сообщение для bFree Посмотреть профиль Найти все сообщения от bFree
 
Регистрация: 19.08.2008
Сообщений: 42

Если функция задается через "=>", а не "->", то @ внутри нее будет указывать на тот объект, в котором объявлена эта ф-ция (если правильно выразился)

Получится такое:
this.bindEvent = function() {
   var self = this;
   $("some element").on("click", function(e) {
       self.onClick()
   }
}
Ответить с цитированием
  #17 (permalink)  
Старый 15.11.2012, 01:11
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

bind штука хорошая.
Жаль неработает в ie 8 и более младших.
неработает в андроидах<4й версии
Походу iphone тоже не будет работать, как я понял bind нет даже в последнем safary mobile

я бы пока побрезговал пользоваться.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 15.11.2012 в 01:23.
Ответить с цитированием
  #18 (permalink)  
Старый 15.11.2012, 01:47
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

ну да, так можно попробывать
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 15.11.2012 в 01:58.
Ответить с цитированием
  #19 (permalink)  
Старый 15.11.2012, 02:05
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

можно немного подругому вызывать попробывать, хотя кривовато конечно.

if (typeof Function.prototype.bind=="undefined"){
    Function.prototype.bind=function(self,func){
         return function(){
              func.apply(self,arguments);
         }  
    }
}

и юзать
$('#element').on('click', this.clickHandler.bind(this,this.clickHandler)) ;


масло маслянное получается,
но работать вроде должно
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 15.11.2012 в 02:13.
Ответить с цитированием
  #20 (permalink)  
Старый 15.11.2012, 02:22
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

а как тебе вот такой прикол ?

Function.prototype.bind2=function(self){
          fun=this;
          return function(){
          	fun.apply(self,arguments)
          }
             
        } 
z=function(){ alert(this.x) }.bind2({x:100})
z();


в ие вроде пашет
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 15.11.2012 в 02:28.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование классов в JavaScript devote Ваши сайты и скрипты 70 01.02.2013 17:17
Рандомный class или id fAmOus Элементы интерфейса 4 14.07.2012 14:28
Uncaught ReferenceError: Class is not defined igshul Javascript под браузер 3 24.04.2012 11:49
Заменить id на class klev2004 Общие вопросы Javascript 0 05.04.2012 16:03
Cannot instantiate non-existent class: DOMDocument Beton-Karton Events/DOM/Window 0 02.03.2011 12:01