JavaScript和Node.JS - 无法理解为什么回调中的变量未定义

时间:2016-06-29 05:56:50

标签: javascript node.js scope

所以我开始学习NodeJS并创建一个简单的HTTP服务器,如Node Node Book中所述。我有一个Router对象,其中包含路由table,它将路径名映射到要调用的函数。这是通过键值对象实现的。

现在,我的Server对象有一个router成员,指向上面提到的对象。 (对于松耦合,保持路由器和服务器分离),以及启动服务器的start()方法。如下所示:

Server.prototype.start = function() {
    var myRouter = this.router;
    http.createServer(function(req, res) {
        var path = url.parse(req.url).pathname; 
        res.write(myRouter.route(path, null));
        res.end();
    }).listen(80);
};

现在我创建了一个myRouter变量,该变量指向router对象的Server引用,然后在createServer函数中,使用它执行路由&# 39; s route()功能。这段代码有效。但是,如果我省略创建myRouter变量部分并直接在createServer中执行路由,请执行以下操作:

res.write(this.router.route(path, null));

它说this.router未定义。我知道这与范围有关,因为提供给createServer的函数会在收到请求后执行,但是,我无法理解创建myRouter如何解决此问题。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

.account.home

答案 1 :(得分:1)

变量myRourer解决了问题,因为函数会记住创建它们的环境(Closure)。因此,回调知道myRouter变量

您的问题的另一个解决方案是使用bind方法(bind)将回调的值设置为特定对象。

http.createServer(function(req, res) {
    var path = url.parse(req.url).pathname; 
    res.write(this.router.route(path, null));
    res.end();
}.bind(this)).listen(80);