Видите ли мой друг.
![]() всех кто не хочет прописывать self в каждой функции кидают в бездонную яму. Кстатии зачем в каждой ? Прописывайте только там где сочтёте это нужным. Раньше когда вы использывали self у вас было замыкание и переменная хранилась в нём, а сейчас замыкания нет и self хранить негде. максимум что можно, это передавать self в параметре, каждой фнкции. Просто смеритесь, вы обречены :D |
В итоге получается, что JS требует постоянного написания одинакового кода, который явно излишен. Печалька.
Если прописывать прямо в методах, то получаем дополнительный мусор в коде. Кажется, этот вопрос решили в Coffeescript |
Цитата:
|
Нет. Просто хочу, чтобы можно было в коллбеках использовать указатель на объект безо всяких .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 } } А если таких методов у меня в классе много? Я не хочу в каждом таком месте писать одинаковую строчку. |
iMaxmaxmaximus, я тебя понял. Замыкания действительно нет и self хранить негде.
Очень-очень жаль. Не люблю раздувать код одинаковыми конструкциями.. В coffescript это решено на уровне синтаксиса: Код:
onClick: () -> |
Если функция задается через "=>", а не "->", то @ внутри нее будет указывать на тот объект, в котором объявлена эта ф-ция (если правильно выразился)
Получится такое: this.bindEvent = function() { var self = this; $("some element").on("click", function(e) { self.onClick() } } |
bind штука хорошая.
Жаль неработает в ie 8 и более младших. неработает в андроидах<4й версии Походу iphone тоже не будет работать, как я понял bind нет даже в последнем safary mobile я бы пока побрезговал пользоваться. |
ну да, так можно попробывать :)
|
можно немного подругому вызывать попробывать, хотя кривовато конечно.
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)) ; масло маслянное получается, но работать вроде должно |
а как тебе вот такой прикол ? :D
Function.prototype.bind2=function(self){ fun=this; return function(){ fun.apply(self,arguments) } } z=function(){ alert(this.x) }.bind2({x:100}) z(); в ие вроде пашет |
Часовой пояс GMT +3, время: 04:27. |