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的人决定把这个设置成不确定的。