1

在应用程序中:

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

在引导程序中:

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

...

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

回到应用程序:

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

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

如果假设我想直接从 App 调用 onBootstrapComplete,我必须将其命名为.onBootstrapComplete( this )。

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

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

2 回答 2

5

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

this.onBootstrapComplete = _.bind( function() {
   ...
   this.someFunction(); // this context is available now
   ... 
}, this );
于 2013-01-27T11:25:05.037 回答
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,已经有一个绑定函数[MDN]

this.onBootstrapComplete = function()
{
        this.something();
        this.someValue = ...
}.bind(this);
于 2013-01-27T11:49:51.427 回答