概述
JS预编译
函数的预编译总是发生在函数执行的前一刻
-
前奏
- 一切声明的全局变量都是window的属性;
eg
var num = 1;
console.log(window.num); // --> 1;
- imply global 暗示全局变量 : 任何一个变量未经声明就赋值,此变量为全局对象所有 ——> 即为window的属性;
eg:
function test() {
var a = b = 1;
console.log(a, b);
}
test(); // --> 1 1;
console.log(b); //--> 1;未经声明就赋值,就成为全局变量 打印 1
console.log(a); //--> 报错; a是全局没有,只在test内,作用域问题,下节将;
-
函数预编译过程
- 创建一个AO对象 --> AO:执行期上下文 Activation Object
- 找形参和变量声明,将变量名和形参名作为AO的属性名,并赋值为undefined;(若名称相同则写一个并赋值undefined);
- 将形参和实参统一(将实参值赋给AO中与形参相同的属性);
- 找函数声明,赋值为函数体(若函数名与上面某个变量相等时,则用函数体覆盖);
eg
function test(a, b){
var b = 10;
function a(){
console.log(a);
}
console.log(a, b);
}
test(1, 2);
/*
预编译过程
1. 创建一个AO对象
==>
AO = {};
2. 找形参和变量声明
==>
AO = {
a : undefined,
b : undefined
}
3. 将形参和实参统一
==>
AO = {
a : 1,
b : 2
}
4. 找函数声明,赋值为函数体
==>
AO = {
a : function a(){
console.log(a);
},
b : 2
}
*/
//当预编译执行完:AO为第四步的AO 此时执行函数内部语句:b = 10; ==>
AO{
//
a : function a(){
//
console.log(a);
//
},
//
b : 10
//
}
//a的函数声明在预编译时执行过了
不看
//执行console.log(a, b) ==>
function(){} 10
ps:js函数执行时查找变量的值都在自己的AO(Activation Object)中找如果没有会去GO(Global Object 下面讲)中找.
-
全局预编译过程
- 创建一个GO对象 --> Global Object
- 找变量声明作为AO的属性名,并赋值为undefined;(若名称相同则写一个并赋值undefined);
- 找函数声明,赋值为函数体(若函数名与上面某个变量相等时,则用函数体覆盖);
ps : GO === window
AO GO关系:AO里没有去GO找,
GO没有那就没有了;
最后
以上就是悲凉手套为你收集整理的JS预编译过程详解JS预编译的全部内容,希望文章能够帮你解决JS预编译过程详解JS预编译所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复