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)]](https://i-blog.csdnimg.cn/blog_migrate/1793df8c32091e2ecb48ddb3ada660cf.png#pic_center)
422

被折叠的 条评论
为什么被折叠?



