关于js,大家都知道js是一门单线程的解释性语言,解释性语言就是指一句一句执行的语言。
js在执行前会先预编译下,简单点说就是扫描js代码,对要声明变量的声明,提前的提前!
接下来就讲一下预编译的四部曲:
- 创建AO对象
- 找到形参和变量声明,将变量和形参名作为AO属性名,值为undefined
- 将实参值和形参统一(赋值)
- 在函数体里面找函数声明,值赋值函数体
从上面的步骤可以看出,函数声明是最后的,相当于优先级最高,现在来看看一些有趣的题目:
cosole.log(a); //undefined
var a;
function test(a){
console.log(a);//function a(){}
var a=123;
console.log(a);//123
function a(){}
console.log(a);//123
}
test(1);
预编译的四部曲分析一下:
AO(全局):{
a:undefined,
test:undefined
}
AO(局部/函数内) {
a:undefined-->1-->function a(){}
}
按照这样的规律去分析的话,一些看起来吓人的面试题也就能解决了