Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在EventEmitter.prototype.once in node中使用$self。。。?_Javascript_Node.js_Closures - Fatal编程技术网

Javascript 为什么在EventEmitter.prototype.once in node中使用$self。。。?

Javascript 为什么在EventEmitter.prototype.once in node中使用$self。。。?,javascript,node.js,closures,Javascript,Node.js,Closures,我正在看event.js中once()的实现: EventEmitter.prototype.once = function(type, listener) { if ('function' !== typeof listener) { throw new Error('.once only takes instances of Function'); } var self = this; function g() { self.removeListener(t

我正在看event.js中once()的实现:

EventEmitter.prototype.once = function(type, listener) {
  if ('function' !== typeof listener) {
    throw new Error('.once only takes instances of Function');
  }

  var self = this;
  function g() {
    self.removeListener(type, g);
    listener.apply(this, arguments);
  };

  g.listener = listener;
  self.on(type, g);

  return this;
};
记住,您将执行
某个_object.once('on',function(){console.log(this);})

临时函数g()具有self.removeListener(type,g)
。我认为这是因为g()中的上下文在其他情况下是错误的。但是,之后的一行,变量
this
用于
listener.apply(this,arguments)但是。。。这不是将全局上下文传递给
侦听器(参数)吗?

然后稍微向下一点,它运行
self.on
,而不是
this.on

现在。。。我很困惑。我对Javascript相当陌生,但仍然对上下文感到困惑。但是,这个密码快把我逼疯了。。。谁能在这里给我指点一下吗

谢谢


Merc.

在您的示例中,像
self
一样使用
的副本的原因是当
不会像您希望的那样在给定函数调用中进行设置时,您可以在
self
中引用保存的副本,并且始终可以访问它

在Javascript中,
由调用上下文设置,除非使用
.call()
.apply()
显式设置

正常的函数调用将导致将
设置为全局对象

x.once()
这样的方法调用将导致
once()
方法中的
this
被设置为对象
x

在您的特定情况下,
g()
被用作回调函数。因此,
将由该回调函数的调用方使用的上下文设置。但是,如果上下文不符合要求,并且
g()
希望访问
EventEmitter
对象,那么它可以使用
self
引用,该引用保存在
g()
所在的闭包中。如果没有
self
中保存的引用,函数
g()
可能无法访问所需的值,因为
函数
g()
中的
可能设置为其他值

如果我遵循此
.once()
方法的意图,那么我看不出有任何理由使用
self
引用,因为
.on()
将导致
在调用
g()
时根据需要设置此
。在这种情况下,当使用的回调没有按需要设置
时,它可能只是一个正在遵循的约定,可以安全地工作(即使在这个特定代码中严格来说并非如此)

至于调用
self.on()
而不是
this.on()
,在执行上没有区别。
的值在给定函数上下文中不会更改。有些库将
this
分配给一个局部变量,然后引用该局部变量,这主要是因为它可以在最小化时节省几个字节,因为最小化程序可以将局部变量重命名为一个单字节值,但
this
的值不能重命名


下面是一篇相关文章,其中有一个较长的讨论:

关于“如果没有self中保存的引用,函数g()可能无法访问所需的值,因为g()函数中的该值可能被设置为其他值。”。。。但我不确定这一点。阅读events.js的代码,
EventEmitter.prototype.emit()
具有
。。。侦听器[i].apply(this,args)。所以调用方中的
这个
仍然与对象相同。。。?我根本看不出函数中的
有什么意义。。。一定有一个?参见第114行(调用)和第184行(
once()
)@Merc-如果我遵循…
,我会在开头的段落中说同样的话。我认为,
self
只是出于惯例或最小化的原因,而不是为了让代码正常工作而需要这样做。你也说过同样的话。。。!好吧,我不会发疯的。非常感谢。(接受答覆)