14.11.2012, 19:58
|
Профессор
|
|
Регистрация: 04.02.2011
Сообщений: 1,815
|
|
Видите ли мой друг.
всех кто не хочет прописывать self в каждой функции кидают в бездонную яму. Кстатии зачем в каждой ?
Прописывайте только там где сочтёте это нужным.
Раньше когда вы использывали self у вас было замыкание и переменная хранилась в нём, а сейчас замыкания нет и self хранить негде.
максимум что можно, это передавать self в параметре, каждой фнкции.
Просто смеритесь, вы обречены
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Последний раз редактировалось DjDiablo, 14.11.2012 в 20:05.
|
|
14.11.2012, 20:08
|
Аспирант
|
|
Регистрация: 19.08.2008
Сообщений: 42
|
|
В итоге получается, что JS требует постоянного написания одинакового кода, который явно излишен. Печалька.
Если прописывать прямо в методах, то получаем дополнительный мусор в коде.
Кажется, этот вопрос решили в Coffeescript
|
|
14.11.2012, 21:02
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от bFree
|
А придется это делать очень часто, т.к. постоянно работаю с jquery и другими фреймворками.
|
в jQuery почти везде можно передать контекст исполнения для обработчика ($.ajax точно, как помню)
|
|
14.11.2012, 21:53
|
Аспирант
|
|
Регистрация: 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
}
}
А если таких методов у меня в классе много? Я не хочу в каждом таком месте писать одинаковую строчку.
|
|
14.11.2012, 21:58
|
Аспирант
|
|
Регистрация: 19.08.2008
Сообщений: 42
|
|
iMaxmaxmaximus, я тебя понял. Замыкания действительно нет и self хранить негде.
Очень-очень жаль. Не люблю раздувать код одинаковыми конструкциями..
В coffescript это решено на уровне синтаксиса:
Код:
|
onClick: () ->
// bla-bla-bla
bindEvent: () ->
$("some element").on "click" (e) => // => как раз позволяет передать this
@onClick() |
И из этого кофескрипт как раз соберет то, что я не хочу писать руками: var _this = this;
|
|
14.11.2012, 22:08
|
Аспирант
|
|
Регистрация: 19.08.2008
Сообщений: 42
|
|
Если функция задается через "=>", а не "->", то @ внутри нее будет указывать на тот объект, в котором объявлена эта ф-ция (если правильно выразился)
Получится такое:
this.bindEvent = function() {
var self = this;
$("some element").on("click", function(e) {
self.onClick()
}
}
|
|
15.11.2012, 01:11
|
Профессор
|
|
Регистрация: 04.02.2011
Сообщений: 1,815
|
|
bind штука хорошая.
Жаль неработает в ie 8 и более младших.
неработает в андроидах<4й версии
Походу iphone тоже не будет работать, как я понял bind нет даже в последнем safary mobile
я бы пока побрезговал пользоваться.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Последний раз редактировалось DjDiablo, 15.11.2012 в 01:23.
|
|
15.11.2012, 01:47
|
Профессор
|
|
Регистрация: 04.02.2011
Сообщений: 1,815
|
|
ну да, так можно попробывать
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Последний раз редактировалось DjDiablo, 15.11.2012 в 01:58.
|
|
15.11.2012, 02:05
|
Профессор
|
|
Регистрация: 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.
|
|
15.11.2012, 02:22
|
Профессор
|
|
Регистрация: 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.
|
|
|
|