JS运行三部曲

JS运行三部曲

1.语法分析
先全部扫一遍 看有没有语法错误.

2.预编译(执行前一刻)
函数声明整体提升
变量 声明提升

3.解释执行
(解释一行执行一行)


预编译执行四部曲
函数中
1.创建AO对象 (Activation Object (执行期上下文))
2. 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3.将实参值和形参统一
4.在函数体里面找函数声明,值赋予函数体

全局中
1. 生成一个叫GO 对象 Global Object
(window就是全局)

例:

    <script>
        /*首先执行前会进行全局预编译:
        先把全局的变量声明找出来值为undefined 和函数声明 值赋予函数体,提升到最上端
       GO{a:undefined; 
        demo:function demo(e){.....}

        } 然后开始执行*/
        a = 100;              //1.执行到这里 GO{a:100; 把100 赋值给a  然后下一行
        function demo(e){             //2.执行到这里  因为demo:function demo(e){.....} 提升 所以忽略 然后下一步
            function e(){}             //5.提升 忽略
            arguments[0] = 2;         //6.实参值改变 形参也改变  AO{ e:2;
            console.log(e);        //7.   输出 2
            if (a){                //8. a此刻为 AO{ a:undefined; 所有if整段代码不执行
                var b = 123;
            }
            var c;          //9.提升 忽略
            a = 10;         // 10.  AO{ a:10;
            var a;            //11.提升 忽略
            console.log(b);   //12.因为AO{ b;undefined; 所以 输出 undefined
            f = 123;           //13.因为 AO中没有f ,所以把f放入GO中GO{f:undefined;  把123赋值给它GO{f:123;
            console.log(c);   //14.因为AO{ c;undefined; 所以输出 undefined
            console.log(a);         //15. 看10步 AO{ a:10;    输出 10      执行完毕
        }
        var a; //3. 提升 忽略 下一步

         //4.函数执行前进行函数预编译
        /*4.1找形参和变量声明,将变量和形参名作为AO属性名,值为undefine
        AO{ e:undefined;
          c:undefined;
          a:undefined;
           }
           4.2将实参值和形参统一
         AO{ e:1;
         c:undefined;
         a:undefined;
         }
         4.3在函数体里面找函数声明,值赋予函数体
         AO{ e: function e(){};
         b;undefined;
         c:undefined;
         a:undefined;
         }
        */
        demo(1); 
        console.log(a); //100   //16. 看1.    GO{a:100; 输出 100
        console.log(f); //123   //17.看 13.    GO{f:123;     输出 123 

    </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值