Node.js非严格模式下全局调用函数时this.name取值异常咨询
为什么Node.js中调用函数时
this.name返回undefined? 嘿,这个问题其实是Node.js和浏览器在全局作用域处理上的差异搞出来的,我给你掰扯清楚:
首先你得明白,Node.js里每个JS文件都是一个独立的模块,模块有自己的私有作用域。你用var name = "kenny"声明的变量,并没有挂载到全局对象(也就是global)上,而是属于当前模块的局部变量。
而当你在非严格模式下直接调用nameLogger()时,函数里的this确实指向的是全局对象global——这部分你观察到的是对的。但问题在于,global对象上压根没有name这个属性,所以this.name自然就返回undefined了。
对比一下浏览器环境:在浏览器里全局作用域就是window对象,用var声明的全局变量会自动成为window的属性,所以this.name能拿到值,但Node.js的模块机制和这个完全不一样。
解决方法有这几种:
- 直接把变量挂载到全局对象
global上:
global.name = "kenny"; function nameLogger() { console.log(this); // 输出全局对象 console.log(this.name); // 输出"kenny" } nameLogger();
- 如果不想用全局变量,直接在函数里引用模块作用域的
name变量就行(不用通过this):
var name = "kenny"; function nameLogger() { console.log(this); // 输出全局对象 console.log(name); // 输出"kenny" } nameLogger();
- 或者用箭头函数,箭头函数的
this会继承外层作用域的this(Node.js模块顶层的this是module.exports),不过这种情况直接引用变量更直接:
var name = "kenny"; const nameLogger = () => { console.log(this); // 指向module.exports console.log(name); // 输出"kenny" } nameLogger();
核心就是一句话:Node.js的模块作用域把var声明的变量隔离了,它们不会自动变成全局对象的属性,而直接调用函数时this指向全局对象,所以拿不到模块里的name。
内容的提问来源于stack exchange,提问作者Kenny Omega
相关产品推荐
相关产品推荐

