来自 nodejs source code (LOC 179) ,我们有以下内容:

EventEmitter.prototype.once = function(type, listener) { 
 
  /** ... **/ 
 
  function g() { /** ... **/ } 
 
  g.listener = listener; // => ??? 
  this.on(type, g); 
 
  return this; 
}; 

到目前为止,我的想法是这样的:

EventEmitter.once() 设置一个 type 事件,并在通过 调用回调 listener 后立即将其删除g()。但是 g.listener = listener; 这行到底做了什么?

它是否在构造函数g()调用时为构造函数对象添加了一个函数对象属性listener

请您参考如下方法:

设置它以便您稍后可以调用 removeListener

如果你调用this.once(event, listener),然后又调用了this.removeListener(listener),代码将找不到listener 在列表中,因为它包含在 g 中。

这就是为什么在 L214 进行测试的原因做:

 if (list === listener || 
      (util.isFunction(list.listener) && list.listener === listener)) { 


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!