对js预编译的一些理解
自己有点忘了预编译是啥了,今天来回忆一下,首先在说js预编译之前,先来说下什么是函数声明?
举个简单例子:
// 函数表达式 var f = function() { console.log(1); } // 函数声明 function f (){ console.log(2); }
其实预编译可以分为四部曲:
1.创建AO对象
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3.将实参和形参统一
4.在函数体里面找函数声明,值赋予函数体
接下来看一个例子:
function fn (a) { console.log(a); var a = 123; console.log(a); function a () {}; console.log(a); var b = function () {}; console.log(b); function d () {}; } fn(1)
第一创建OA以及找到形参和变量声明: {
a: undefined,
b: undefined,
d: undefined
}
第二形参和实参统一
{
a: 1,
b: undefined,
d: undefined
}
第三步在函数体里面找函数声明,值赋予函数体
{
a: function a () {},
b:undefined,
d: undefined
}
预编译完成,注意预编译发生在函数执行前一刻
所以最后结果是:
function fn (a) {
console.log(a); // function a() {}
var a = 123;
console.log(a); // 123
function a () {};
console.log(a); // 123
var b = function () {};
console.log(b); // function () {}
function d () {};
}
fn(1)
从上述预编译过程来看出函数在js的位置是非常高,所以有时候说函数js中的一等公民是有道理的!