单个js代码块执行分析

JS代码执行案例

本人js小白一个,有问题的可以一起探讨。下面说一下学习时遇到的困惑。

直接上代码:

<script>
    a=0
    b=0
    function A(a){
       A=function(b)
        {
            alert(a+b++)
        }
        alert(a++)
    }
    A(1)
    A(2)
</script>

运行结果:弹出 1 和 4

分析 :拿到代码,先进提升后执行

提升时 A被放到EC(G)中的VO中,同时生成一个堆用来存放A(a)的函数体,堆的地址与VO中的A相连,提升完毕,开始执行代码;执行到A(1)时进入函数A(a){ } ,然后对形参赋值,a=1,形参赋值后,看有无提升,没有提升,执行内部代码,第一句便是 A=function(b) ,这里将function(b)形成的堆的地址给A,A在EC(A(1))中不存在,便去全局EC(G)中去找,找到函数A,进行到这里A指向的堆的地址变为function(b)的地址,但是,函数还未执行完毕,继续进行执行alert(a++),这里EC(A(1))中由于形参赋值存在a=1,说一输出结果应为1。自此代码A(1)执行完毕

开始执行A(2)

这时,由于A(1)中函数A的地址改变,指向function(b),函数A就变成了function(b)

   function(b){
        alert(a+b++)
    }

进入函数,先给形参赋值,b=2;由于放置函数 function(b)的堆一直被引用,function(b)又引用A(1)中的a 所以形成闭包,A(2)运行alert(a+b++)时b=2,没有A,就去A(1)中找到a,由于A(1)运行后,a=2,所以a+b++就等于4,自此代码全部执行完毕

下面放一个简单的图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8HXopl2E-1595032748994)(C:\Users\faster\Desktop\05-练习题.png)]

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值