在咱们写了不少关于业务逻辑的代码后、过程当中会遇到不少关于变量定义、变量提高、做用域的问题,理解完预编译就清晰不少javascript
引擎检查你的代码有没有什么低级的语法错误java
预编译简单理解就是在内存中开辟一些空间,存放一些变量与函数面试
解释执行顾名思义即是执行代码了bash
发生在script内代码块执行前、也能够说预编译发生在函数执行的前一刻函数
对于这样一段代码,常常在不少面试中会看到测试
let a = 0
function test(a,b){
console.log(a)
console.log(b)
a = 1
console.log(a)
console.log(c)
function c(){}
function a(){}
console.log(a)
}
test(1)
复制代码
请问这段代码的输出是? 对于这样的函数预编译,咱们能够记住预编译的4个步骤ui
听起来有点生涩难懂,可是咱们一行一行跟着这四个步骤一块儿作的时候就明朗了spa
开始解题code
AO{
}
复制代码
AO{
a : undefined,
b : undefined
}
复制代码
AO{
a : 1,
b : undefined
}
复制代码
知足 function a(){}这样的叫函数声明 而相似于let a = function(){} 这样的并非函数声明
复制代码
咱们找到了a、c函数声明,咱们须要去改写AO对象中对应的属性名,因为c这个属性名并不存在,咱们要建立并用函数赋值,所以咱们获得了这样一个对象对象
AO{
a : function(){},
b : undefined,
c : function(){}
}
复制代码
而且在函数的解释执行阶段并不会对对应AO对象的属性名进行值的改写
至此,预编译阶段结束,进行到函数的解释执行阶段
let a = 0
/**
* 测试函数
* @param {*} a
* @param {*} b
*
*
*
* 咱们在预编译结束的时候获得这样一个对象
* {
* a:function(){},
* b:undefined,
* c:function(){}
* }
*/
function test(a,b){
console.log(a)
console.log(b)
a = 1
console.log(a)
console.log(c)
function c(){}
function a(){}
console.log(a)
}
test(1)
复制代码
下面咱们会逐字逐句解释打印的值
{
a : 1,
b : undefined,
c : function(){}
}
复制代码
至此、这个实例解释完毕
若是从全局出发,则是建立一个GO对象,顾名思义Global Object,其四个步骤和函数内的预编译四个步骤同样