NodeJS,Express,Prototyping中的变量范围问题

时间:2014-01-09 12:37:36

标签: javascript node.js express prototype

文件: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 时会出现未定义的错误。

为什么会这样。我在这做错了什么。

1 个答案:

答案 0 :(得分:5)

这不是范围问题,而是this问题。

通常在JavaScript中,this完全由如何调用函数设置,而不是在其定义的位置。所以正在发生的事情是你将你的方法作为一个回调传递,但是因为没有以一种将this设置为你的实例的方式调用它。 (规范的下一个版本ES6将具有this绑定到它们的“箭头函数”,而不是根据它们的调用方式设置。)

在函数调用期间设置this的常用方法是将函数作为从对象检索函数引用的表达式的一部分来调用,例如

foo.bar();

bar设置为this时调用foo。但是这个:

var f = foo.bar;
f();

... this将是未定义的(在严格模式下)或全局对象(在松散模式下)。

设置this的其他方法是通过Function#callFunction#apply,您可以调用该函数并明确说出this应该是什么。

您可以使用bind解决此问题:

app.post('/', httpRequestHandler.handleRootPost.bind(httpRequestHandler));

bind返回一个函数,该函数在调用时将调用原始函数,并将this设置为您传入的第一个参数。

更多(在我的博客上)

相关问题