我不理解下面代码中的 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
答案 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);