Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

const 和 let 到底定义到哪儿去了?

  一直都没发现,原来 const 和 let 定义的全局变量不会被注册到 window 上。今天写着代码唱着歌就踩到了这个坑,于是三观尽毁。虽然这两个东西是块作用域的,但是全局声明为何会有块作用域?而且还发现了另一个情况,如果 window 上定义一个不可写的属性会出现神奇的情况。
  下面是目前的情况,只有用 var 定义的全局变量才可以在 window 对象上访问到,而 let 和 const 则访问不到。但是它们确实是一个全局变量,可以直接通过变量名访问到。 <script> var a = 1; let b = 2; const c = 3; console.log([ window.a, window.b, window.c ]); // [ 1, undefined, undefined ] </script> <script> console.log([ window.a, window.b, window.c ]); // [ 1, undefined, undefined ] console.log([ a, b, c ]); // [ 1, 2, 3 ] </script>   但是我又做了下面这件事,事先在 window 上定义一个不可配置的变量,那么 let 和 const 的定义就会出错。比如:
<script> Object.defineProperty(window, 'b', {}); Object.defineProperty(window, 'c', {}); </script> <script> let b = 2; </script> <script> const c = 3; </script> Uncaught TypeError: Identifier 'b' has already been declared Uncaught TypeError: Identifier 'c' has already been declared   可是如果把属性定义和变量声明放在同一个 SCRIPT 块里就不会报错。
<script> Object.defineProperty(window, 'b', {}); Object.defineProperty(window, 'c', {}); let b = 2; const c = 3; console.log(window.b, window.c); // [ undefined, undefined ] console.log(b, c); // [ 2, 3 ] </script>   反正我已经一脸懵逼了。
网名:
54.211.148.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^