浏览器包括渲染引擎和解析引擎,解析引擎主要负责解析js代码
一、语法分析
js解析引擎首先会先扫描所有的代码,查看代码是否存在语法错误,如果代码存在语法错误,程序立即报错,不会继续执行;如果未发现语法错误,则进入代码正式处理中的预解析(预编译)阶段;
二、代码正式处理
1、预编译阶段
全局执行代码:
①、创建全局对象GO,建立一个存放全局变量的仓库;
②、找到变量申明,提升变量申明,将变量存储在全局仓库中;
③、找到函数申明,提升函数申明;
js是单线程的语句,会解释一行执行一行,执行到函数时进入函数体,将控制权交给函数体;
函数内部代码:
①、创建AO对象;
②、找到变量声明和形参,赋值为默认值undefined;
③、将实参的值赋值给形参;
④、找到函数声明,然后提升函数声明;
代码实例:
<script>
function fn(num){
//首先创建AO,将变量声明和形参,赋值为默认值undefined;
// AO{
// num:undefined;
// num2:undefined;
// }
//然后将实参的值赋值给形参
// AO{
// num:5
// num2:undefined;
// }
//找到函数申明,提升函数申明
// AO{
// num:function num(){}
// num2:function(){console.log(1)}
// }
console.log(num); //function num(){}
var num = 10;
console.log(num); //10
function num(){} //函数申明,第三步提升
console.log(num); //10
console.log(num2); //function(){console.log(1)}
var num2 = function(){ //只有var num2;被提升,而且会被后面的函数申明覆盖
console.log(2)
}
console.log(num2); //function(){console.log(2)}
function num2(){ //函数申明,第三步提升(会覆盖掉前面的变量申明(num2)提升)
console.log(1)
}
}
fn(5);
</script>
当函数执行完毕之后,函数会被销毁;