文件: MainApp.js
var reqHandler = reqire('HTTPRequestPostHandler')..
...
...
var httpRequestHandler = new reqHandler();
app.post('/', httpRequestHandler.handleRootPost);文件: HTTPRequestPostHandler.js
HTTPRequestPostHandler =function(){
this.someVar = value;
}
HTTPRequestPostHandler.prototype.handleRootPost{
console.log(this.someVar) //Error -> this.someVar is undefined.
}我有这两份文件。MainApp.js是为每个端点配置express和各种处理程序的地方,例如'/‘。
但是,当发生post请求并调用请求处理程序(HTTPRequestPostHandler.prototype.handleRootPost)时,我在访问变量this.someVar时会得到一个未定义的错误。
为什么会发生这种事。我在这里做错什么了。
发布于 2014-01-09 12:42:39
这不是一个范围问题,而是一个this问题。
通常,在JavaScript中,this的设置完全取决于函数的调用方式,而不是定义函数的位置。因此,所发生的事情是将您的方法作为回调传递进来,但由于它不是以将this设置为实例的方式调用的。(该规范的下一个版本ES6将具有“箭头函数”,这些函数将this绑定到它们,而不是通过调用方式来设置。)
在函数调用期间设置this的通常方法是调用函数作为从对象检索函数引用的表达式的一部分。
foo.bar();它调用bar,并将this设置为foo。但这一点:
var f = foo.bar;
f();...does没有。this将是未定义的(在严格模式下)或全局对象(在松散模式下)。
设置this的其他方法是通过Function#call和Function#apply,它们允许调用函数并显式地说明this应该是什么。
你可以用bind来解决这个问题。
app.post('/', httpRequestHandler.handleRootPost.bind(httpRequestHandler));bind返回一个函数,当调用该函数时,将调用原始函数,并将this设置为作为第一个参数传入的函数。
更多(在我的博客上)
https://stackoverflow.com/questions/21020495
复制相似问题