js 预编译

2020-09-12  本文已影响0人  再见地平线_e930
预编译发生在函数执行的前一刻

预编译的四个过程

1.创建 AO 对象(也称执行期上下文,是作用域链的一部分);

2.找形参和变量声明,将形参个变量声明作为 AO 属性名,值为 undefined;

3.将实参值和形参值统一;

4.在函数体里面找函数声明,值赋予函数体

例子1:

function fn(a) {
            console.log(a); // function

            var a = 123; // a = 123

            console.log(a); // 123

            function a() {} // 已提升,就不用管了

            console.log(a); // 123

            //下面这句话不是函数声明,是函数表达式
            var b = function() {} // b = function() {}

            console.log(b); // function

            function d() {}
        }

        fn(1);

        //1.创建 AO 对象
        AO {
            
        }

        //2.找形参和变量声明,值为undefined
        AO {
            a: undefined,
            b: undefined,
        }

        //3.将实参值和形参同一
        AO {
            a: 1,
            b: undefined,
        }

        //4.在函数体里找函数声明,值赋予函数体
        AO {
            a: function a() {},
            b: undefined,
            d: function d() {}
        }

        //5.执行函数

例子2:

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

test(1);

例子3:

function test(a, b) {
            console.log(a); // function
            console.log(b); // undefined
            var b = 234;
            console.log(b); // 234
            a = 123;
            console.log(a); // 123
            function a() {}
            var a;
            b = 234;
            var b = function() {}
            console.log(a); // 123
            console.log(b); // function
        }

test(1);
上一篇 下一篇

猜你喜欢

热点阅读