这个关键字在一个对象的函数中

时间:2016-06-18 21:57:22

标签: javascript node.js this

我不理解下面代码中的 var self = this; 。我知道“当在一个函数中使用时,它的值是”拥有“该函数的对象。”。那么对象函数内的这个关键字引用那个对象,对吧?但是下面代码的注释说明相反那个。

我很困惑为什么我们不能在对象的函数中使用这个关键字,在下面的代码中?这在下面的代码中引用了什么?

var util = require('util');
var EventEmitter = require('events').EventEmitter;

// @station - an object with `freq` and `name` properties
var Radio = function(station) {

    // we need to store the reference of `this` to `self`, so that we can use the current context in the setTimeout (or any callback) functions
    // !!!! -> using `this` in the setTimeout functions will refer to those funtions, not the Radio class
    var self = this;

    // emit 'close' event after 5 secs
    setTimeout(function() {
        self.emit('close', station);
    }, 5000);

    // EventEmitters inherit a single event listener, see it in action
    this.on('newListener', function(listener) {
        console.log('Event Listener: ' + listener);
    });
};

// extend the EventEmitter class using our Radio class
util.inherits(Radio, EventEmitter);

// we specify that this module is a refrence to the Radio class
module.exports = Radio;

我阅读了类似的帖子并理解,但我无法理解以下代码的评论。另外,没有人在构造函数中的函数的函数参数中提到this关键字。特别是粗体写的第二句让我感到困惑:

  

我们需要将this的引用存储到self,以便我们可以   使用setTimeout(或任何回调)函数中的当前上下文。   在setTimeout函数中使用this将引用这些功能,   不是广播课

引自:http://www.hacksparrow.com/node-js-eventemitter-tutorial.html

2 个答案:

答案 0 :(得分:1)

值{og this关键字将根据当前上下文更改值。 this如何工作的完整描述有点复杂。有关详细信息,请参阅MDN

在您的情况下,this最终调用setTimeout调用中的匿名函数时,self将具有不同的值。但是,/rest/personcalculation/{personName}变量仍然可用。

答案 1 :(得分:0)

'这个'的目的在函数中是对调用该函数的对象的引用。由于您使用setTimeout将匿名函数传递给窗口,因此任何'这个'该函数内的调用将引用窗口对象。

您可以使用Javascript Bind功能来保留'这个'在回调函数中,无论它在何处被调用。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

你的setTimeout函数如下所示:

setTimeout(function() {
    this.emit('close', station);
}.bind(this), 5000);