文件: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配置的地方,以及每个端点的各种处理程序,例如“/'.
但是当发出发布请求并调用请求处理程序( HTTPRequestPostHandler.prototype.handleRootPost )时,访问变量 this.someVar 时会出现未定义的错误。
为什么会这样。我在这做错了什么。
答案 0 :(得分:5)
这不是范围问题,而是this
问题。
通常在JavaScript中,this
完全由如何调用函数设置,而不是在其定义的位置。所以正在发生的事情是你将你的方法作为一个回调传递,但是因为没有以一种将this
设置为你的实例的方式调用它。 (规范的下一个版本ES6将具有this
绑定到它们的“箭头函数”,而不是根据它们的调用方式设置。)
在函数调用期间设置this
的常用方法是将函数作为从对象检索函数引用的表达式的一部分来调用,例如
foo.bar();
在bar
设置为this
时调用foo
。但是这个:
var f = foo.bar;
f();
... 不。 this
将是未定义的(在严格模式下)或全局对象(在松散模式下)。
设置this
的其他方法是通过Function#call
和Function#apply
,您可以调用该函数并明确说出this
应该是什么。
您可以使用bind
解决此问题:
app.post('/', httpRequestHandler.handleRootPost.bind(httpRequestHandler));
bind
返回一个函数,该函数在调用时将调用原始函数,并将this
设置为您传入的第一个参数。
更多(在我的博客上):