JavaScript入门(四)-预编译(函数内)
一、预编译前置知识-全局变量
- imply global 暗示全局变量:即任何变量,未经声明就赋值,此变量为全局对象所有。
//以下三种方式效果相同
a = 10;
window.a = 10;
window {
a : 10;
}
function test() {
var b = a =10;//此时a声明就赋值,为全局变量,b不是
}
- 一切的声明的全局变量,全是windows的属性,
var a = 10;//效果等价1
var b = 20;
//在全局范围内访问a的话就是相当于访问window.a,b同理。
window 全局变量的对象,window即为全局变量的域。
二、预编译
预编译:在代码逐行执行前,先进行的编译,在执行中不再重复执行。
先上,简单口诀
- 函数声明整体提升
- 变量 声明提升
示例函数
//预编译发生在函数执行的前一刻
//以此为例,分析结果
function test(a, b){
console.log(a);
console.log(b);
var b = 234;
console.log(b);
a = 123;
console.log(a);
function a (){}
var a;
b = 234;
var b = function(){}
console.log(a);
console.log(b);
}
test(1);
步骤:
-
- 创建AO对象 Activation Object (执行上下文)
-
- 找形参和变量声明,将变量声明和形参的名作为AO的属性名,值为undefined。
-
- 将实参和形参相统一
-
- 找函数体内的函数声明,将函数名作为属性名,将函数作为属性值。
以下为步骤解释
// 第一步
AO {
}
//第二步
AO {
a : undefined,
b : undefined,
}
//第三步,test(1)这里只有a被有实参
AO {
a : 1,
b : undefined,
}
//第四步,b为表达式,并不是声明b对象的函数体,上述代码中是赋值。
AO {
a : function a(){},
b : undefined,
}
执行的结果(在执行过程中相同属性的值会覆盖):
function a(){}
undefined
234
123
function (){}
以上,此为本人学习过程中的笔记,可能因为能力不足存在一些不足,还请大家多多包涵和给予建议,共同进步。如有问题,敬请私信。