let,const全局定义的变量属于全局作用域还是块级作用域?

  <script>
    //const、let定义在最上端的代码全局都可以访问,所以是全局作用域还是块级作用域?
    const a = 1
    let b = 2
    console.log(window.a); //undefined
    console.log(window.b); //undefined
   //显然全局window对象并不包括a,b
   //有意思的一点,const let定义在全局的变量也是属于块级作用域,
   //可以想象全局作用域里有一个包裹着全局的块级作用域:类似这种感觉({a,b.....})
   //(所有的变量都在其中,只不过只有let,const定义的全局变量具有块级作用域,window不能访问;
   //而非let,const定义的全局变量,即使也在这个隐形的块级作用域内,由于这些变量没有块级作用域,属于全局作用域)
  </script>

总结:在全局定义变量时(包括定义函数),var所定义的变量(以及function定义的函数)具有全局作用域,所以定义完毕以后就会添加入全局对象(在浏览器中即window全局对象)。window全局对象中的变量,可以通过window.xxx来访问到。由于const let定义的变量是块级作用域,因此即使是const let全局定义的变量也不能通过window.xxx访问到(报错)。我们可以联想有一个包裹着全局代码的大括号(块级作用域);这样一来,全局定义的const,let在这个最外层的块级作用域中;显然window不能访问;但是没有块级作用域的全局变量即使在这个大括号内也属于全局作用域,window自然可以理所当然的访问到。

原文地址:https://www.cnblogs.com/xjt31/p/13990721.html