js的声明提升

106 阅读1分钟

javascript代码在执行时表面并不是由上到下一行一行执行的。

浏览器引擎会在解释 JavaScript 代码之前首先对其进行编译。编译阶段中的一部分工作就是找到所有的声明,并用合适的作用域将它们关联起来。所以正确的思路应该是: 所有变量的声明都会在任何代码被执行前首先被处理(函数也一样)。

优先提升变量声明,之后提升函数声明

提升只会提升到当前作用域!

 function fn(a) {
        console.log(a);
        var a = 2;
        function a() {}
        console.log(a);
      }
      fn(1);

输出结果是 ƒ a() {} 2

该代码可以转化为

function fn(a) {
        var a;
        function a() {}
        console.log(a);
        a = 2;

        console.log(a);
      }
      fn(1);

另外let和const不会声明提升

 function fn(a) {
        console.log(a);
        let a = 2;
   
      }
      fn(1);

 function fn(a) {
        console.log(a);
       
        const a = 2;
      }
      fn(1);

会提示错误: Uncaught SyntaxError: Identifier 'a' has already been declared

参考文献:

zhuanlan.zhihu.com/p/29160823