JS变量提升的处理机制

164 阅读1分钟

浏览器开辟出供代码执行的栈内存后,代码并没有自上而下立即执行,而是先做了一些事(如词法解析、变量提升等)后,再去执行代码

那么何为变量提升?
在代码执行之前,把当前作用域中所有带var、function关键字的,进行提前声明和定义

  • 带var的,只是提前声明,没有赋值,默认值是undefined
  • 带function的声明并赋值
   /*
    变量提升 var a; var b; 
   */
   console.log(a) // undefined
   var a = 12
   var b = a
   b = 13
   console.log(a) // => 12 
   /*
   变量提升 function sum(){...}
   */
   console.log(sum(15,35)) //50
   function sum(n,m) {
      return n + m
   }
    /*
    变量提升: var sum;
    函数表达式: 使用var 创建sum,变量提升只会声明变量,不会赋值,默认值是undefined
    此时函数在前面执行,而函数它此时是没有值的,不能执行,会报错
    函数表达式(在真实项目中,更常用,因为它更严谨)
    */
    console.log(sum) // =>undefined
    sum(10,30)       //=> Uncaught TypeError: sum is not a function
    var sum = function (n,m) {
        return n + m
    }

变量提升,容错性更好,但不严谨,ES6语法中的let定义变量更严谨些!!!