一 什么是?

概括:简略说就是在js代码执行前引擎会先进行预编译,预编译期间会将变量申明与函数申明晋升至其对应作用域的最顶端。
  1. 变量晋升:
    全局作用域中申明的变量会晋升至全局最顶层,函数内申明的变量只会晋升至该函数作用域最顶层。

    function variableUp() { if (!foo) {     var foo = 5; } console.log(foo); // 5}variableUp();
  2. 函数晋升:
    函数晋升只会晋升函数申明,而不会晋升函数表达式,定义形参就相当于在函数作用域中申明了变量

    function funUp(a) {    conosle.log(a)//output: undefined    function foo() {        console.log(1);    }    foo(); // output: 2    function foo() {        console.log(2);    }}funUp()var funUp=function(){  console.log(funUp)}

    在JavaScript中的函数是一等公民,函数申明的优先级最高,会被晋升至以后作用域最顶端


二 对于变量晋升及函数晋升的了解

三 实际例题
题目:

    function fn(a,c){          console.log(a) //output: function a(){}          var a=123          console.log(a)  //output: 123          console.log(c)  //output: function c(){}          function a(){}          if(false){            var d =678          }          console.log(d)  //output: undefined          console.log(b)  //output: undefined          var b = function(){}          console.log(b)   //output: function          function c(){}          console.log(c)   //output: function c      }      fn(1,2)

剖析:

oa={    a:undefined,//1, function,   123    c:undefined,//2, function    d:undefined,    b:undefined,                //function}

js中无论哪种模式申明(var, let, const, function, function, class)都会存在晋升景象,不同的是,(var,function,function)的申明会在晋升时进行初始化赋值为 undefined,因而拜访这些变量的时候,不会报 ReferenceError异样,
应用 let,const,class 申明的变量,
被晋升后不会被初始化,此时如果拜访这些变量会抛出ReferenceError 异样,看上去就像没被晋升一样

结束语:无论是晚期的代码,还是ES6中的代码,咱们都须要遵循一点,先申明,后应用。