前端面试中有时候会被问到你了解js的编译时和运行时吗?
不知道你们遇到过没,反正小编遇到过哈!
这道题搞懂了,说明你前端基础数比较扎实的!
今天咱们就来说一说这个难啃的骨头。
首先我们了解下编译时发生了什么?
先说下函数编译时发生的事情。
1.创建AO对象(Activation Object(执行期上下文))
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3.将实参值与形参相统一
4.在函数中找函数声明,作为属性名,值为函数体
下面我们看下这个程序:
function test(a,b){
document.write(a);
c=0;
var c;
a=3;
b=2;
document.write(b);
function b(){}
function d(){}
document.write(b);
}
test(1)
那么这三处document.write分别会打印什么了?
根据上边的四步:第一步
AO{}
第二步:找变量和形参
AO{
a:undefiend,
b:undefiend,
c:undefiend
}
第三步:将实参与形参对应,那么就变成了
AO{
a:1,
b:undefiend,
c:undefiend
}
第四步:找函数声明,值赋为函数体
函数声明有b函数和c函数,那么AO就变成了这样:
AO{
a:1,
b:function(){},
c:undefiend,
d:function(){}
}
接下来开始运行:
那么第一处运行时 a的值就是1
接下来给c赋值为0,a赋值为3,b赋值为2
AO{
a:3,
b:2,
c:0,
d:function(){}
}
那么接下来第二处打印b的时候,b的值就是2。
继续执行函数b和d已经在预编译的时候赋值过了,直接跳过,然后打印b,那么第三处b的值还是2。
以上即为运行时与编译时的区别,我这里再总结一下,再预编译时候会形成以下两点:
1.函数声明整体提升
2.变量 声明提升
希望能帮助到你,愿你好运。
举报/反馈

前端程序媛

469获赞 82粉丝
专注互联网领域与分享前端方面的知识。
关注
0
0
收藏
分享