Видите ли мой друг.
![]() всех кто не хочет прописывать 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, время: 05:02. |