2024 js预编译

1、一切未声明定义的变量(没有var)是全局变量属于window全局域

2、全局声明定义的变量是全局变量属于window全局域

    function test() {
      var a = b = 123

    }
    test()
    //console.log(a)//报错 a is not defined
    console.log(window.a) //undefined
    console.log(b, window.b) //123 123 b未声明直接赋值
    var aa = 1234
    console.log(aa, window.aa) //1234 1234 

3、1、创建一个AO对象 2、找形参和变量声明,将变量和形参名作为AO属性名,值 为undefined 3、将实参值和形参统一 4、在函数体里找函数声明,将函数名作为AO属性名,值为函数体本身

function fn(a) {
      console.log(a) //ƒ () { console.log(333) }
      var a = 123;
      console.log(a) //123
      function a() { }
      console.log(a) //123 
      var b = function () { console.log(333) }
      console.log(b) //ƒ () { console.log(333) }
      function d() {
      }
    }
    fn(1)
    //预编译发生在函数执行前一刻
    //预编译:1、创建一个AO对象 AO={} 2、找形参和变量声明,将变量和形参名作为AO属性名,值 为undefined  AO={a:undefined,b:undefined}3、将实参值和形参统一 AO={a:1,b:undefined} 4、在函数体里找函数声明,将函数名作为AO属性名,值为函数体本身 AO={a:function a() {},b:undefined,d:function d(){}}
    //执行函数体(函数和变量声明可以不看):1、console.log(a) 从AO找a:function a() {};   2、var a = 123; 给AO中属性a重新赋值AO={a:123,b:undefined,d:function d(){}} 3、console.log(a) 从AO找a:123; 4、console.log(a) 从AO找a:123; 5、var b = function () { } 给AO中属性b重新赋值AO={a:123,b:function () { },d:function d(){}}5、console.log(b) 从AO找b:function () { };

 

    function test(a, b) {
      console.log(a) //1
      c = 0
      var c;
      a = 3
      b = 2 
      console.log(b) //2 c=0 a=3 b=2 这样未声明直接赋值的变更 如果test AO中没有相关的属性则将放于GO(window)
      function b() { }
      function d() { }
      console.log(b) //2
    }
    test(1)

 

posted @ 2024-05-07 14:59  howhy  阅读(3)  评论(0编辑  收藏  举报