Node.js环境下全局与函数内this的取值差异及疑问
Node.js 全局作用域与函数内this取值差异的原因
先看你给出的代码表现:
console.log(this) // {} function abc(){ console.log(this) } abc() // global
console.log(this === module.exports) // true function abc(){ console.log(this === global) } abc() // true
这种差异的核心原因是Node.js的模块封装机制:
Node.js会自动把每个单独的JS文件包裹在一个匿名函数里执行,这个包裹函数的结构大概是这样:
(function(exports, require, module, __filename, __dirname) { // 你编写的文件代码就位于这个函数内部 });
当Node执行这个包裹函数时,会将module.exports作为this的指向传入——这就是为什么文件顶层的this会等于module.exports,而非全局的global对象。
而你定义的普通函数abc,当以abc()的形式直接调用时,属于非严格模式下的普通函数调用,这种场景下函数内部的this会默认绑定到全局对象,也就是Node环境里的global。
和浏览器环境的区别
浏览器没有模块封装这一层,JS代码直接运行在全局作用域(window对象)中,所以顶层的this自然指向window;普通函数直接调用时,this同样指向window,因此顶层和函数内的this表现一致。
Node.js之所以这么设计,是为了实现模块间的隔离,通过包裹函数让每个模块拥有独立的上下文,避免不同模块的顶层变量污染全局空间。
内容的提问来源于stack exchange,提问作者Muttu Kanabur
相关产品推荐
相关产品推荐

