首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJS、Express、Prototyping中的可变范围问题

NodeJS、Express、Prototyping中的可变范围问题
EN

Stack Overflow用户
提问于 2014-01-09 12:37:36
回答 1查看 128关注 0票数 0

文件: MainApp.js

代码语言:javascript
复制
var reqHandler = reqire('HTTPRequestPostHandler')..
...
...
var httpRequestHandler = new reqHandler();


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

文件: HTTPRequestPostHandler.js

代码语言:javascript
复制
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时会得到一个未定义的错误。

为什么会发生这种事。我在这里做错什么了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-09 12:42:39

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

通常,在JavaScript中,this的设置完全取决于函数的调用方式,而不是定义函数的位置。因此,所发生的事情是将您的方法作为回调传递进来,但由于它不是以将this设置为实例的方式调用的。(该规范的下一个版本ES6将具有“箭头函数”,这些函数将this绑定到它们,而不是通过调用方式来设置。)

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

代码语言:javascript
复制
foo.bar();

它调用bar,并将this设置为foo。但这一点:

代码语言:javascript
复制
var f = foo.bar;
f();

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

设置this的其他方法是通过Function#callFunction#apply,它们允许调用函数并显式地说明this应该是什么。

你可以用bind来解决这个问题。

代码语言:javascript
复制
app.post('/', httpRequestHandler.handleRootPost.bind(httpRequestHandler));

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

更多(在我的博客上)

  • http://blog.niftysnippets.org/2008/03/mythical-methods.html
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21020495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档