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

啊,奇怪而无用的知识又增长了!刷论坛还能水文章,太棒了!(🐶作用域

相关文章
相关标签/搜索