局部预编译过程

 分析代码是否正确 

        function fm(a){

            console.log(a);

            var a=20

            function fn(){}

            console.log(a);

        }

        var b=100

        fm(b)

       1.隐式操作 预编译

         var

         function

         2.形式函运==》函数调用了以后  在运行代码之前

         会生成一颗对象:执行期上下文对象(AO):函数每次调用都会生成

         2.1.给AO对象添加成员:函数内部的局部变量和形参变量  名 作为AO对象的属性名 赋值undefined

        AO:{

             a:undefined

            a:undefined 形参和局部变量一样的时候 不影响

        }

          2.2.把传入的实参赋值给AO对象的属性

         AO:{

             a:100

         }

          2.3.局部函数的声明,赋值  把局部函数的名字让AO对象也有一个一样的成员名 把函数体赋值给这个属性

         AO:{

            a:100,

             fn:function fn(){}

         }

         3.运行代码预编译过的就不在运行

        AO:{

             a:100,

             fn:function fn(){},

            console.log(a);//100

             a=20   //运行之后a被覆盖

             console.log(a);//20

         }

// 全局作用域运行代码时也又有预编译 ==》全局预编译

        1.生成一个对象Gobal

        GO:{}

        2.把所有的全局变量 设置为GO的属性名

        GO:{a:undefind}

        3.把所有函数名作为GO的成员名 把函数体赋值给这个成员

        GO:{a:undefind,fn:function fn(){console.log(66)}}

        

        4.执行代码

         GO:{a:undefind,fn:function fn(){console.log(66)}}

         console.log(a);  //a=undefind

         a=20  //a=20

         全局预编译还有一部==》不同的环境中运行js代码不一样

         GO对象的成员全部浅拷贝给环境对象window

        node.js环境中没有这一步

       拓展:关于访问成员  console.log(a) 访问的是GO对象的成员(作用域链中没有就报错)  

        console.log(window.a)不报错 原型链也没有 返回undefined  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值