當使用nodejs事件系統時,我遇到了一個煩人的問題。如下面的代碼所示,當偵聽器捕獲事件時,事件發射器對象在回調函數中擁有「this」而不是偵聽器。node.js EventEmitter導致範圍問題
如果將回調放入監聽器的構造函數中,這不是一個大問題,因爲除了指針'this'之外,還可以使用構造函數作用域中定義的其他變量,如'self'或'that'。
但是,如果將回調放在構造函數之外(如原型方法),則在我看來,沒有辦法獲取偵聽器的「this」。
不太確定是否有其他解決方案。此外,爲什麼nodejs事件發出使用發射器作爲偵聽器的調用者安裝有點困惑?
util = require('util');
EventEmitter = require('events').EventEmitter;
var listener = function() {
var pub = new publisher();
var self = this;
pub.on('ok', function() {
console.log('by listener constructor this: ', this instanceof listener);
// output: by listener constructor this: false
console.log('by listener constructor self: ', self instanceof listener);
// output: by listener constructor this: true
})
pub.on('ok', this.outside);
}
listener.prototype.outside = function() {
console.log('by prototype listener this: ', this instanceof listener);
// output: by prototype listener this: false
// how to access to listener's this here?
}
var publisher = function() {
var self = this;
process.nextTick(function() {
self.emit('ok');
})
}
util.inherits(publisher, EventEmitter);
var l = new listener();
https://www.npmjs.com/package/scoped-event-emitter – 2014-12-26 20:48:11