JavaScript之预编译
了解一点小知识:
1)为什么需要函数?
将代码封装成函数的形式,可以减少代码的耦合(编程追求的是高内聚,弱耦合)
2)和C语言一样,JS在使用函数之前,也要进行函数声明,示例代码如下:
function sayHello() {
console.log("hello world!")
}
3)函数表达式分为两种:一种是命名函数表达式,一种是匿名函数表达式
//命名函数表达式
var say = function sayHello(){
console.log("hello world!")
}
//匿名函数表达式
var say1 = function(){
console.log("hello world!")
}
命名函数表达式与匿名函数表达式唯一的区别:
console.log(say.name) ==> sayHello
console.log(say1.name) ==> say1
4)我们需要了解的是:【在执行一个函数之前,浏览器会做3件事】:
a.语法分析:检查代码有没有低级错误(又会报错)
b.预编译
c.解释执行:看一行翻译一行,执行一行
现在进入主题【预编译】:
1.你需要知道
1)imply global【暗示全局变量】:即任何变量,如何变量未经声明就赋值,此变量就为全局对象所有;
2)一切声明的全局变量,全是window的属性,简单粗暴的来说,window就是全局
3)每个function都会生成一个自己作用域
2.预编译四部曲(注:预编译发生在函数执行的前一刻)
这是重点,一定要牢记四部曲哇!
这是重点,一定要牢记四部曲哇!
这是重点,一定要牢记四部曲哇!
重要的事情说三遍
a.创建AO【Activation Object】即活跃对象(作用域即执行期上下文);
b.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined;
c.将实参值和形参统一,即把实参的值传给形参;
d.在函数体里面找函数声明,值赋予函数体。
啥?啥?不要慌张,下面用一个简单的例子来分析一下预编译四部曲:
function fun(a){
var b = 123;
function c(){
var d = 234;
}
}
fun(6);
预编译过程:
a.在函数fun运行前的一瞬间,生成一个AO对象
fun.AO = {};
b.分析参数(假如没有,略过)
fun.AO ={
a : 6
}
c.分析变量(假如没有,略过)
fun.AO ={
a : 6,
b : undefined
}
d.分析函数声明(假如没有,略过),最终:
fun.AO ={
a : 6,
b : undefined,
c : function(){
var d = 234;
}
上面是一个简单的例子,试着分析一下下面这段代码吧:
function fn(){
console.log(a);
var a = 123;
console.log(a);
function a(){}
console.log(a);
var b = function(){}
console.log(b);
function d(){}
}
fn(1);
//上段代码,在控制台的输出如下:
function a(){}
123
123
function(){}
3.预编译不仅发生在函数体,还发生在全局。其过程与函数体的预编译过程相似(不要第三步).
注:其生成一个GO【Global Object】;
在找变量声明时,将变量作为GO属性名,值为undefined.