全局中的this指向的是(初始时的)module.exports;
默认情况先我们知道模块加载时是先定义了module.exports={};(其实就是这个模块的this) ,然后让exports指向了它:exports = module.exports,注意了重点来了,全局的this指向的是这个初始对象this = module.exports={};但是如果我们显示的重新定义了module.exports=*;它并不会改变exports和this原有的指向(因为这是初始化就完成的),所以全局的this使用就是使用exports,该注意的事项和使用exports一样。
在函数中this指向的是global,这里的函数指普通函数,不是类函数;
上面这种情况是模块中定义函数,模块中使用函数,但如果该函数被导出来,很明显调用者就是被导出的对象module.exports了。
在构造函数中this指向的是它的实例,而不是global;
这个不难理解,构造函数本身的特性。
实际上要理解这个,就必须得理解nodejs的模块化的作用域和一条真理“不管是浏览器还是nodejs,谁直接调用了那个函数this就是谁,不管函数位于什么作用域,在调用时没有指明调用者,调用者就是global或window”,即每个模块都有自己的作用域。同时还有牵涉到exports和module.exports导出定义方式。
总结下来和浏览器唯一不同是模块中全局的this是初始化时的模块对象module.exports;浏览器中是window
箭头函数还是箭头函数的规则,this由函数定义时的上下文决定,nodejs中也一样,不过使用时要注意this指向的是初始的module.exports,如果重新定义了module.exports,就不能使用module.exports访问到了;
箭头函数比较重要的规则
普通函数内部定义的箭头函数,上下文是global或window;
类函数内部定义的箭头函数,上下文是类的实例;