首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Node.js将函数委托给导入的模块

Node.js将函数委托给导入的模块
EN

Stack Overflow用户
提问于 2013-04-13 20:10:16
回答 1查看 1.6K关注 0票数 0

目前我有一个Node.js模块,格式如下:

代码语言:javascript
运行
复制
var events = require('events');
var emitter = new events.EventEmitter();

function emitSomething() {
    emitter.emit("event");
}
exports.emitSomething = emitSomething;
exports.on = emitter.on;

但是,当我调用emitSomething时,任何通过on注册的回调都不会被调用。

我可以通过将最后一行改为

代码语言:javascript
运行
复制
exports.on = function(event, callback) { emitter.on(event, callback); };

我不能将on函数委托给另一个模块中定义的函数,有什么原因吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-13 23:36:00

这是一个常见的JS错误。请注意,on方法依赖于this (在您的示例中为emitter )。但是,所有导出的都是函数本身,所以当您稍后调用它时,它的上下文(emitter)就会丢失。

下面是这个问题的一个小示例:

代码语言:javascript
运行
复制
var someObj = { 
    doSth: function() { console.log(this) } 
};
someObj.doSth(); // "Object { ..."

var doSth = someObj.doSth;
doSth(); // "Window { ..."

当我调用doSth作为someObj的方法时,this如期引用了someObj。在我将函数复制到doSth之后,this引用了它的新上下文,即浏览器中的全局上下文Window。这就是在你的案例中发生的事情。

正如您已经提到的,您必须将emitter上下文绑定到函数。这也可以像这样做:

代码语言:javascript
运行
复制
exports.on = emitter.on.bind(emitter);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15987633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档