【问题标题】:Regarding 'this' in callbacks in node.js [duplicate]关于 node.js 回调中的“this”[重复]
【发布时间】:2012-12-27 16:58:37
【问题描述】:

可能重复:
JavaScript “this” keyword

我对 node.js 中用于 EventEmitter 的回调有点困惑。

var events = require("events");

function myObject() {
    this.name = "Test Object";
    this.x = 99;
    this.y = 100;
}

myObject.prototype = new events.EventEmitter();

var myobject = new myObject();

myobject.addListener('dbg1', function() {
    console.log("this.name = " + this.name);    //this.name gives the name not undefined
    console.log("myobject.name = " + myobject.name);        //so does this 
});

myobject.emit('dbg1');

为什么回调中的this 指的是myobject?回调函数的闭包是这段代码中的全局范围,对吗?

【问题讨论】:

    标签: javascript node.js closures


    【解决方案1】:

    范围与确定来自上下文的this 的值无关。这取决于函数的调用方式。您加载的事件模块将在myobject 的上下文中调用它。

    relevant code 是:

    listener.apply(this, args);
    

    the apply method 的第一个参数是用于调用函数的上下文 (listener)。您可以从那里追溯到对象。

    【讨论】:

    • 我明白了。那么,节点是否也通过 apply 在对象上调用回调?我是 node 和 javascript 的新手,所以我想这是在每个 api 中实现事件的标准方式?
    • 是事件库没有,不是节点本身。事件 api 有多种实现方式,几乎所有东西都会使 this 成为事件绑定的对象。
    【解决方案2】:

    这对于大多数节点代码库都是相同的。很久以前有一个关于这个的小讨论,共识是.call(this) 需要太多的开销,而且放在任何地方真的很难看/很烦人。所以换句话说,永远不要假设this 就是你的想法。

    编辑:没关系,EventEmitter 不适用于这种情况,我完全误解了你的问题。

    【讨论】:

    • 我强烈怀疑,假设 EventEmitter 将始终安排 this 引用作为事件目标的对象是安全的。
    • 嗯,根据昆汀的回答中发布的代码,它肯定可以。
    • @Pointy,是的,我把这个问题误读为“this 不等于我的对象”。我的回答非常无关紧要(我指出节点和节点模块中有很多地方不会在上下文中调用回调)。不过你是对的,EventEmitter::emit 不是其中之一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多