预编译是JavaScript绕不过去的一道坎,有关的题更是层出不穷,今天就由我来彻底的解析什么是前端的预编译。
js有GO对象(global object)和AO对象(active object),先来讲GO对象,
- 进入script标签,在执行代码前的一瞬间会生成一个GO对象
- 分析var声明,变量名为GO对象的属性名,值为undefined,如果变量名重名,不用发生任何改变
- 分析函数声明,变量名为GO对象的属性名,值为函数体,如果变量名重名,直接覆盖属性值。
搞懂了这些,接下来就直接上代码。
//按照规则,先生成一个GO对象,GO={}
console.log(a)//进行函数分析后,所以这里输出 function a(){}
//分析var声明,AO={a:undefined}
var a = 6;
console.log(a)//上一行声明,这里输出6
//分析函数声明,AO={a:function a(){}}
function a(){}
console.log(a)//还是6
var a = function(){}
console.log(a) //上一行声明,这里输出函数 function(){}
通过规则在对应实例,应该是挺容易理解的了。
接下来讲讲最喜欢考的AO对象,其实相比GO对象只是多了一个分析参数的步骤
- 进入script标签,在执行代码前的一瞬间会生成一个AO对象
- 形参作为AO对象的属性名,实参作为AO对象的属性值
- 分析var声明,变量名为AO对象的属性名,值为undefined,如果变量名重名,不用发生任何改变
- 分析函数声明,变量名为AO对象的属性名,值为函数体,如果变量名重名,直接覆盖属性值。
我们也直接上代码吧
//按照规则,在执行成的一瞬间生成一个AO对象,AO={}
//形参作为属性名,实参作为属性值,所以AO={a:1,b:undefined}
function demo(a,b){
console.log(a)//function a(){}
console.log(b)//undefined
var b = 234
//分析var声明,所以AO={a:1,b:undefined}
console.log(b)//234
a = 123
console.log(a)//123
function a(){}
//分析函数声明。AO={a:function a(){},b:underfined}
var a;
b = 456
var b = function(){}
console.log(a)//123
console.log(b)//function(){}
}
demo(1)
以上这些实例足够帮助一个不太理解的程序员彻底搞懂js的预编译了!