在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 = ...
}
答案 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);