全局作用域下的this

1、浏览器环境下

window和this的关系:全局作用域下的this就等于window

console.log(window === this);//true
var a = 1;
var b = function () {
  return "function1";
}
console.log(window.a); //1
console.log(window.b); //ƒ (){ return "function1"; }
console.log(window.a === a); //true
console.log(window.b === b); //true

在全局对象上定义的变量可以直接访问

window.aa = 2;
this.bb = function () {
  return "function2";
}
console.log(aa); //2
console.log(bb); //ƒ (){  return "function2"; }

浏览器环境下获取全局对象的方式:window,self,frames,this

console.log(self.aa);//2
console.log(frames.aa);//3
console.log(self===this);//true
console.log(frames===this);//true

2、node环境下

node中的全局对象是global,但是this并不指向gloabl

定义的全局变量并不会绑定到全局对象gloabl身上,但是可以往global身上添加属性

console.log(this === global);//false
var a="global -> a";
global.b="global -> b";
var obj={
  a: "obj -> a",
  test: function() {
    console.log(this.a);//obj -> a
    console.log(global);
    console.log(global.a);//undefined
    console.log(global.b);//global -> b
  }
}
obj.test();

上面程序中console.log(global)语句输出的gloabl对象为:

<ref *1> Object [global] {
  global: [Circular *1],
  clearInterval: [Function: clearInterval],
  clearTimeout: [Function: clearTimeout],
  setInterval: [Function: setInterval],
  setTimeout: [Function: setTimeout] {
    [Symbol(nodejs.util.promisify.custom)]: [Function (anonymous)]
  },
  queueMicrotask: [Function: queueMicrotask],
  clearImmediate: [Function: clearImmediate],
  setImmediate: [Function: setImmediate] {
    [Symbol(nodejs.util.promisify.custom)]: [Function (anonymous)]
  },
  b: 'global -> b'
}

3、globalThis

在以前,从不同的 JavaScript 环境中获取全局对象需要不同的语句。在 Web 中,可以通过 window、self 或者 frames 取到全局对象,但是在 Web Workers 中,只有 self 可以。在 Node.js 中,它们都无法获取,必须使用 global。

在松散模式下,可以在函数中返回 this 来获取全局对象,但是在严格模式和模块环境下,this 会返回 undefined。

function test1(){
  "use strict"
  return this;
}
function test2(){
  return this;
}
console.log(test1());//undefined
console.log(test2());//Window {...}
console.log(window.test1());//Window {...}

globalThis 提供了一个标准的方式来获取不同环境下的全局 this 对象(也就是全局对象自身)。不像 window 或者 self 这些属性,它确保可以在有无窗口的各种环境下正常工作。所以,你可以安心的使用 globalThis,不必担心它的运行环境。为便于记忆,你只需要记住,全局作用域中的 this 就是 globalThis

  • 浏览器环境下
    console.log(globalThis === window);//true
    var a = 1;
    console.log(globalThis.a);//1
    
  • node环境下

    console.log(globalThis === global);//true
    var a = 1;
    globalThis.b = 2;
    console.log(globalThis.a);//undefined
    console.log(global.b);//2
    
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容