91- 有关词法检测和重复声明的问题

91 阅读1分钟

看代码输出结果并小结

   var a = 12
   var a = 15
   console.log(a) //=> 15
   let a = 12
   let a = 13
   console.log(a)
   //=> Uncaught SyntaxError: Identifier 'a' has already been declared

小结: 在相同的作用域中(或执行上下文中),var允许重复声明,而let不允许重复声明

   /*=>浏览器开辟栈内存供代码自上而下执行之前,不仅有变量提升,还有很多其他操作
      =>"词法解析"或"词法检测":检测当前即将要执行的代码是否会出现"语法错误"SyntaxError
      =>如果出现错误,代码将不会再执行(第一行都不会执行)
   */
    console.log(1) //=>出现语法错误,不会执行任何一行代码
    let a = 12
    console.log(a)
    let a = 13 //=>Uncaught SyntaxError: Identifier 'a' has already been declared
    console.log(a)
   console.log(1) //=>1
   console.log(a)
   let a = 13 //=>Uncaught ReferenceError: Cannot access 'a' before initialization

小结: 代码在执行之前,会进行词法解析,变量提升等操作。如果出现语法错误,代码将一行都不会执行

   console.log(a)
   var a = 12
   let a = 13 //=>Uncaught SyntaxError: Identifier 'a' has already been declared
   console.log(a)
    /*=>所谓重复是:不管之前通过什么办法,只要当前栈内存中存在了这个变量
      =>我们使用let/const重复再声明这个变量就是语法错误
    */
    console.log(a)
    let a = 13
    var a = 12 //=>Uncaught SyntaxError: Identifier 'a' has already been declared
    console.log(a)
    fn() //=> 5
    function fn(){console.log(1);}
    fn() //=> 5
    function fn(){console.log(2);}
    fn() //=> 5
    var fn=function(){console.log(3);}
    fn() //=> 3
    function fn(){console.log(4);}
    fn() //=> 3
    function fn(){console.log(5);}
    fn() //=> 3

fn.png

小结: function存在变量提升,function可以重复声明