【问题标题】:What is 'this' refering to?“这”指的是什么?
【发布时间】:2015-01-16 11:00:34
【问题描述】:

我知道“this”是指使用“this”的函数对象。那么在这种情况下,function(req, res) 中的“this”指的是哪个对象?

router.post('/upload', function(req, res, next) {
  console.log(this);
  console.log(dir);
  ...
}

【问题讨论】:

  • this 将始终绑定到调用函数的人
  • 是的,这就是为什么我要问谁在调用这个函数
  • 你在控制台上得到了什么?
  • @slier——调用者不是this

标签: javascript node.js scope this


【解决方案1】:

这取决于router.post() 如何调用回调。首先要看的是文档。如果没有记录,请查看代码。一般来说,可以假设如果没有对this 进行特殊处理,则它指向全局对象(如果处于严格模式,则为未定义)。

如果router.post() 是这样实现的:

router.post = function (route, callback) {
    // ..
    callback(a,b,c);
}

然后this 将指向全局对象或未定义,具体取决于天气与否"use strict"

但是router.post()也可以这样实现:

router.post = function (route, callback) {
    // ..
    callback.call(something,a,b,c);
}

在这种情况下,this 将指向 something 是什么。

或者也可以这样实现:

router.post = function (route, callback) {
    // ..
    var foo = {
       a : callback
    }
    a(a,b,c);
}

在这种情况下,this 将指向 foo 对象。

如您所见,在 javascript 中,调用者确定 this 的值。

查看我对这个相关问题的回答以了解 this 在 javascript 中的行为:How does the "this" keyword in Javascript act within an object literal?


补充答案:

如果您阅读了上面的链接,那么您也会意识到您可以使用 bind 或闭包强制 this 成为您想要的任何东西:

router.post('/upload', (function(req, res, next){
    console.log(this); // prints whatever myThis below points to
    console.log(dir);
}).bind(myThis));

【讨论】:

  • +1 但不是“调用者”,而是“它是如何被调用的”,如果这不是太多分裂的头发(因为它可能是从全局代码调用的)。 ;-)
  • 啊,我对“调用者”的定义和你的有点不同。我猜你假设调用者指的是调用函数的上下文。我用“调用者”这个词来指代键盘后面的程序员:)
  • 是的。也许我只是在造成混乱……
  • @RobG:不,澄清是好的。如果你误解了我,那么很可能我犯了一个错误
【解决方案2】:

根据 doc,this 指的是对象的所有者。 在您的情况下,函数的所有者应在 router.post (如果有)中定义

//Definition of router.post
router.post = function(string, block) {    
    block(x,y,z);
}

在这种情况下,这应该没有所有者? 通常在使用“this”时,需要使用关键字“new”

function Foo()
{
    this.a = 1;
}

var foo = new Foo();
console.log(foo.a);  // 1

【讨论】:

    猜你喜欢
    • 2017-05-04
    • 2023-03-10
    • 2016-05-15
    • 1970-01-01
    • 2012-01-10
    • 2013-01-16
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多