函数预编译,执行步骤

1、先创建一个AO对象;

2、将形参和变量变为AO对象里的属性,值为undefined;

3、实参赋值形参;

4、在函数体内找函数声明,值赋予函数体;

实例1:

// 1.创建AO对象;
        //     AO{}
        // 2.形参,变量变为AO对象的属性,值为undefined
        //     AO{
        //         foo:undefined
        //       }
        // 3.3.实参赋值形参(因为没有实参,foo还是undefined);
        //     AO{
        //         foo:undefined
        //        }
        // 4.函数体内找函数声明,值赋予函数体;
        //     AO{
        //         foo:foo(){ }
        //     }
        // 直接返回foo的值foo(){ }
            function bar (){
                return foo; 
                foo = 10;
                function foo(){
                    
                }
                var foo = 11 
            }
            console.log(bar())

实例2:

// 1.创建AO对象;
        //     AO{}
        // 2.形参,变量变为AO对象的属性,值为undefined
        //     AO{
        //         foo:undefined
        //       }
        // 3.实参赋值形参(因为没有实参,foo还是undefined);
        //     AO{
        //         foo:undefined
        //        }
        // 4.函数体内找函数声明,值赋予函数体;
        //     AO{
        //         foo:foo(){ }
        //     }
        // 5.此时函数预编译结束,属性foo的值还是foo(){ };
        // 6.函数开始执行,执行到foo = 10时,foo属性值为10
        // 7.function foo () { }已经被编译过了,继续往下执行
        // 8.var foo = 11 ,将foo属性值10变为11;
        // 9.当return时候,返回的是11
        function bar(){
            foo = 10 ;
            function foo (){
                
            }
            // var foo = 11 ;
            return foo
        }
        console.log(bar());    
原文地址:https://www.cnblogs.com/chaojimali/p/12769421.html