It's magic!

js是世界上最好的語言!!

今天在v站看到一個帖子,問道:git

var a = 10; {
    a = 99;

    function a() {
        console.log(a);
    }
    a = 30;
}
console.log(a);

「塊級做用域,10!」,我看完便冷笑道。es6

然而Google Chrome Version 88.0.4324.150 輸出的99卻狠狠地打了個人臉。github

來不及多想,就看到底下有老哥給出了一個GitHub Issue(這就是專業.jpg),issue中的回覆又指向了一篇文章瀏覽器

粗看了下文章,直接說個人總結:code

  1. 嚴格模式下,這裏的a確實應該是10,非嚴格模式纔是99, es規範準確的定義了該特性在嚴格模式中應有的表現。。
  2. 在es6規範以前,塊級做用域因爲是一個很廣泛需求,瀏覽器各顯神通,都有本身的實現,形成了必定分裂,後來規範出了一個補充,定義了在非嚴格模式下,該特性應有的表現。
  3. 根據補充規範,以上代碼能夠視爲
var a;
a = 10; 
{
    let a = function () {console.log(a);}
    a = 99;

    function a() {      // 等同於(var) a = (let) a , 
        console.log(a); // 即把內部a的值(99)賦給外部a,這也是爲何最後打印出來是99
    }
    a = 30; // 這裏只將內部a的值改成了30,外部仍是99
}
console.log(a); // 99

啊,奇怪而無用的知識又增長了!刷論壇還能水文章,太棒了!(🐶作用域

相關文章
相關標籤/搜索