Сейчас пишу кое-какое совсем несложное 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)

Надеюсь, понятно что тут происходит и как это использовать. Рассказывать не буду, не маленькие уже.

FriendFeed comments