回调此上下文

时间:2013-01-27 11:21:53

标签: javascript callback this

在App中:

var bootstrap = new Bootstrap();
bootstrap.init( this, this.onBootstrapComplete );

在Bootstrap中:

this.init = function( app, completeHandler ){
    _app = app;
    _completeHandler = completeHandler;
        ...
}

...

var _allReady = function(){
        _completeHandler( _app );
}

回到App:

this.onBootstrapComplete = function( app )
{
        app.something();
        app.someValue = ...
}

我想在onBootstrapComplete中获得这个上下文。 它有效,但看起来不正确:))

如果让我们说,我想直接从应用程序调用onBootstrapComplete,我将不得不把它的这个 .onBootstrapComplete(这个)。

我该怎么做才能让我的onBootstrapComplete看起来像这样:

this.onBootstrapComplete = function()
{
        this.something();
        this.someValue = ...
}

2 个答案:

答案 0 :(得分:5)

我建议使用underscore.js。有关详细信息,请参阅http://underscorejs.org/#bind

this.onBootstrapComplete = _.bind( function() {
   ...
   this.someFunction(); // this context is available now
   ... 
}, this );

答案 1 :(得分:1)

调用函数时会计算

this。假设您在函数this中使用f

基本上有两种方法可以调用f

(expr).f() 如果f在某个对象上被称为属性,this将评估该对象expr
f() 在这种情况下,this将评估为window

由于您将该功能传递给bootstrap,因此只能将该功能称为f()

您可以使用闭包:

var self = this;
this.onBootstrapComplete = function()
{
        self.something();
        self.someValue = ...
}

或者,您可以使用函数恰当地f.apply()函数:

function bind(context, f){
    return function() {
        return f.apply(context, arguments);
    }
}

this.onBootstrapComplete = bind(this, function()
{
        this.something();
        this.someValue = ...
});

或者使用ECMAScript 5,is already a bind function[MDN]

this.onBootstrapComplete = function()
{
        this.something();
        this.someValue = ...
}.bind(this);