美文网首页
JavaScript的预编译

JavaScript的预编译

作者: 云凡的云凡 | 来源:发表于2020-11-21 19:59 被阅读0次
    一、预编译

    1、检查通篇的语法错误
    2、预编译的过程

    函数声明整体提升。
    变量只有声明提升,赋值不会提升。
    3、解释一行,执行一行

    二、暗示全局变量

    未被声明就赋值了的话,那么该变量就是全局变量,所有权归window

            a = 2
            console.log(a);//2
            document.writeln(window.a)//2
    
       function test() {
                var a = b = 1
            }
            test()
            //console.log(a); //a is not defined
            console.log(b);//1
            console.log(window.a);//undefined
            console.log(window.b);//1
    
        console.log(a());//2   undefined
            var a = 1
            function a() {
                console.log(2); //1   2
            }
            console.log(a);//3   1
    
          console.log(a);//ƒ a(a) {...}
            function a(a) {
                var a = 10
                var a = function () {
    
                }
            }
            var a = 1
    
    三、预编译的过程:

    例子1:

    function test(a) {
                console.log(a);  //ƒ a() { }
                var a = 1
                console.log(a); //1 
                function a() { }
                console.log(a);//1
                var b = function () { }
                console.log(b);//ƒ () { }
                function d() { }
            }
            test(2)
    

    创建 AO activation object 活跃对象,函数上下文。
    AO={
    第一步:寻找函数的形参和变量声明
    a=undefined
    b=undefined
    第二步:把实参的值赋值给形参
    a=undefined -> 2
    b=undefined ->
    第三步:寻找函数声明赋值给函数体
    a=undefined -> 2 -> function a() { }
    b=undefined -> -> function () { }
    d=function d() { }
    第四步:逐行执行
    b=undefined -> -> -> function () { }
    }
    例子2:
    第一步:找形参和变量声明
    a=undefined
    b=undefined
    c=undefined
    第二步:把形参给实参
    a=undefined -> 1
    b=undefined
    c=undefined
    第三步:把函数声明给函数体
    因为声明了:function b() { }和 function d() { }
    所以:
    a=undefined -> 1 ->
    b=undefined -> -> function b() { }
    c=undefined -> ->
    function d() { }
    第四步:从上到下逐行执行
    a=undefined -> 1 -> -> 1
    b=undefined -> -> function b() { } -> 6
    c=undefined -> -> -> 6
    function d() { }

     function test(a, b) {
                console.log(a); //1
                c = 0;
                var c;
                a = 5
                b = 6
                console.log(b);  //6
                function b() { }
                function d() { }
                console.log(b);//6
            }
            test(1)
    

    例子3:

            a = 1
            function test() {
                console.log(a);//undefined
                a = 2
                console.log(a);//2
                var a = 3
                console.log(a);//3
            }
    
            test()
            var a
    
            // GO={
            //     a:undefined
            //       1
            //       test:function test(){}
            // }
    //AO 有a就不会去GO找
            // AO={
            //     a:undefined
            //     2
            //     3
            // }
    

    例子4:

            function test() {
                console.log(b); //undefined
                if (a) {
                    var b = 2
                }
                c = 3//相当于在全局声明变量c
                console.log(c);//3
            }
            var a;
            test();
            a = 1
            console.log(a);//1
    
    // GO={
    //     a=undefined
    //    test:f test() {}
    //       1
    // }
    // AO={
    //     b=undefined
    //     c=3  全局
    //     undefined
    //     3
        
    // }
    

    例子5、

            // 1. return 的作用:返回一个值到函数外部,2.终止函数
            function test() {
                return a
                a = 1
                function a() { }
                var a = 2
            }
            console.log(test()); //ƒ a() { }
    
    // AO={
    //     a=undefined   -> function a() { }
    // }
    

    例子6、

            a = 1
            function test(e) {
                function e() { }
                arguments[0] = 2
                console.log(e);//2
                if (a) {//a 是undefined,所以返回false
                    var b = 3
                }
                var c;
                a = 4
                var a;
                console.log(b);//undefined
                f = 5
                console.log(c);//undefined
                console.log(a);//4
    
            }
            var a;
            test(1)
            console.log(a);//1
            console.log(f);//5
    
            // GO={
            //     a=undefined  ->  1
            //     test:function test(){}
            // }
    
            // AO={
            //     e:undefined   ->   1   ->  function e() { }   ->    2
            //     b:undefined
            //     c:undefined
            //     a:undefined   ->  4
            // }
    
    

    相关文章

      网友评论

          本文标题:JavaScript的预编译

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