简单谈一下js的预编译过程。
function test(a,b){
console.log(a)
var a=123;
function a(){}
console.log(b)
var b=234;
console.log(b)
function b(){}
console.log(a)
var b=function(){}
console.log(b)
}
test(1)
我先说一下打印结果,结合实例给大家讲一下我对预编译的理解。
fn-a fn-b 234 123 fn-b
首先js的执行过程会先扫描一下整体语法语句,如果存在逻辑错误或者语法错误,那么直接报错,程序停止执行,没有错误的话,开始从上到下解释一行执行一行。
但是js中首先你要清楚变量声明和函数声明是会提升的。
计算机执行到test()函数时,在执行的前一刻会创建一个ao对象。
ao{
}
这是第一步,创建一个ao对象,第二步是将函数内所有的形参和变量声明储存到ao对象中,value为undefined;
ao{
a:undefined,
b:undefined
}
第三步将形参和实参进行统一。
ao{
a:1,
b:undefined
}
第四步将所有的函数声明的函数名作为ao对象中的key,函数整体内容作为value,存储到ao对象中
ao{
a:function(){},
b:function(){}
}
之后开始打印的a,其实打印的就是ao对象中的a,然后a赋值123,在打印肯定就是123了,里面细节有很多,但是整体步骤就是这些,适合有点基础的前端看,用于给大家巩固一下ao对象的执行过程,go对象同理,只是go指向的是window对象,其实window对象也就是go对象的意思了,只是少了形参和实参统一的步骤罢了。