Сейчас пишу кое-какое совсем несложное iframe-приложение для Вконтактика, где все эти JS-фреймворки нахрен не нужны. Пока изучал примеры таких приложений, наткнулся на такую вот штуку. Речь о ней не пойдёт, с ней все понятно - жуткий код, но вот в качестве примера из нее можно привести одну строчку:
var this_proxy = this;
Это достаточно распространенная проблема с контекстами в коллбэках, видел такое далеко не раз и не два.
Ну, вот на примере кода можно понять, зачем это сделано:
var Class = function(){};
Class.prototype = {
msg: 'Hello, username!',
foo: function(){
var self = this;
return function(){
console.log(self.msg);
};
}
};
var instance = new Class();
instance.foo()(); // тут в консоль, допустим, FireBug выведется "Hello, username!"
Вот некоторые люди постоянно мучаются. Неужели так сложно дополнить прототип Function специальным методом и передавать контекст в коллбэк?
В общем, я не жадный и вбрасываю вполне очевидное, реализованное over 9000 людьми, решение.
Function.prototype.bind = function(ctx) {
var self = this;
return function(){
return self.apply(ctx, arguments);
}
};
//Example
var call = function(fn){
this.msg = 'Hello, username!';
return function(a, b){
fn.bind(this)(a, b);
}.bind(this);
}
call(function(a, b){
console.log(a + b);
console.log(this.msg);
})(3, 4)
Надеюсь, понятно что тут происходит и как это использовать. Рассказывать не буду, не маленькие уже.