美文网首页
JS预编译,变量提升的原因

JS预编译,变量提升的原因

作者: 学不动了Zzz | 来源:发表于2019-05-08 14:33 被阅读0次

    1.imply global 暗示全局变量: 如果变量未经声明就赋值,此变量就归window(全局对象)所有

    a = 10
    console.log(window.a) // 10
    

    2.一切声明的变量,全是window的属性:全局范围内,var(let、const不会)一个变量,这个变量归window(全局对象)所有。 let、const和var的区别

    var a = 10
    console.log(window.a) // 10
    

    函数预编译(函数执行的前一刻)

    function fn (a) {  
      console.log(a)
      var a = 123
      console.log(a)
      function a () {}
      console.log(a)
    }
    fn(1)
    // 编译后:
    function fn (a) {  
      var a
      function a () {}
      console.log(a) // function a () {}
      a = 123
      console.log(a) // 123
      console.log(a) // 123
    }
    fn(1)
    
    编译过程:

    1.创建AO对象(Activation Object :执行期上下文)

    AO {
      a: 
    }
    

    2.将变量和形参名作为AO属性名,值为undefined

    AO {
      a: undefined
    }
    

    3.将实参值和形参统一

    AO {
      a: 1
    }
    

    4.在函数体里面找函数声明,值为函数体(如果函数名和变量或形参名相同,会把之前的值覆盖掉, 所以函数是一等公民)

    AO {
      a: function a() {}
    }
    

    全局预编译

    1.生成一个GO对象 Global Object(就是window)
    2.将变量名作为GO属性名,值为undefined
    3.在全局中找函数声明,值为函数体(如果函数名和变量或名相同,会把之前的值覆盖掉, 所以函数是一等公民)

    相关文章

      网友评论

          本文标题:JS预编译,变量提升的原因

          本文链接:https://www.haomeiwen.com/subject/sgcuoqtx.html