Node和浏览器环境下的全局this

Node和浏览器环境下的全局this

在浏览器环境里,使用constlet都不会把变量添加到windows全局对象里,但是使用var会。

浏览器环境里,在最外层定义一个函数,其内部的this就是windows对象

function fn(){
  this.num = 10
}
fn();
console.log(this); // windows
console.log(this.num) // 10

但在Node里,就不是这样了

function fn(){
  this.num = 10
}
fn();
console.log(this); // {}
console.log(this.num) // undefined
console.log(global.num) // 10

Node环境里,函数内部的this指向global对象,而不是全局的那个真正的this

全局的this是个空对象。

console.log(this) // {}

function fn(){
  console.log(this) // Object [global]
}

事实上如果理解CommonJS模块化概念的话,这个问题就很好理解了,由于一个js文件就是一个模块,所以全局的this实际上指向的是这个模块的module.exports,默认情况下这个module.exports一开始就是一个空对象,没有任何导出的成员。

参考资料


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!