NodeJS:将parameter passing给侦听器

在https://nodejs.org/api/events.html上阅读NodeJS的文档时,我对这个在事件监听器中处理这个区域感到困惑:

“可以使用ES6箭头函数作为监听器,但是,这样做时, this关键字将不再引用EventEmitter实例:”

 const myEmitter = new MyEmitter(); myEmitter.on('event', (a, b) => { console.log(a, b, this); // Prints: ab {} }); myEmitter.emit('event', 'a', 'b'); 

this表示的对象是空的。 请参阅箭头function中的哪些内容?

正如注释中指出的那样, this箭头函数表示了包含箭头函数的范围的上下文。

这是一个例子:

 const EventEmitter = require('events') const myEmitter = new EventEmitter(); this.foo = "bar"; myEmitter.on('event', () => { console.log(this); // { foo: "bar" } }); (function() { this.foo = "baz"; myEmitter.emit('event'); })(); 

直到箭头函数,每个新函数都定义了它自己的this值。 这被certificate是一个面向对象的编程风格的烦人。

An arrow function并不创build它自己的这个上下文,所以这在封闭的上下文中有它的原始含义。 因此,下面的代码按预期工作:

 function Person(){ this.age = 0; setInterval(() => { this.age++; // |this| properly refers to the person object }, 1000); } var p = new Person(); 

欲了解更多详情, 请点击这里和这里 。

你可以绑定this箭头函数,尝试绑定这个by-

 myEmitter.on('event', (a, b) => { console.log(a, b, this); // Prints: ab {} }.bind(this)); 

做进一步的研究:

this在模块脚本中是指模块范围内的输出。 this在REPL中是指global对象。

看着尚巴朗巴拉的答案。 this在严格模式下的IIFE是未定义的,在标准模式下它是全局对象。

从: 为什么console.log(this)在节点中返回空对象? 由TJ Crowder

因为NodeJS在一个模块中运行你的代码,并且它引用了它为你的模块的输出(它也是它提供的模块variables的输出属性)创build的对象。 (因为在模块文档中他们没有提到,我怀疑使用它可能不是一个好主意 – 用出口代替。)

但是,调用IIFE的代码调用它与全局对象相关,因为在松散(非严格)模式下,不是通过对象属性调用普通函数,而是将其设置为全局对象。 (在严格的模式下,这将是不确定的。)

为什么this在严格模式下的IIFE中变得不明确?

From: 为什么在使用strict时,“this”在匿名函数中是undefined? 由jAndy

这是因为,直到ECMAscript 262版本5,如果使用构造函数模式的人忘记使用new关键字,那么会出现很大的混淆。 如果您在ES3中调用构造函数时忘记使用new,则会引用全局对象(浏览器中的窗口),并且会使用variables来打开全局对象。

那是非常糟糕的行为,所以ECMA的人决定把这个设置成不确定的。