- 预编译分为全局预编译和局部预编译,全局预编译发生在页面加载完成时执行,而局部预编译发生在函数执行的前一刻。
- 预编译阶段变量声明和函数声明,没有初始化行为(赋值),匿名函数不参与预编译 。只有在解释执行阶段才会进行变量初始化
- 首先JavaScript的执行过程会先扫描一下整体语法语句,如果存在逻辑错误或者语法错误,那么直接报错,程序停止执行,没有错误的话,开始从上到下解释一行执行一行。
- 全局预编译3个步骤:
创建GO对象(Global Object)全局对象。
找变量声明,将变量名作为GO属性名,值为undefined
查找函数声明,作为GO属性,值赋予函数体 - 局部预编译的4个步骤:
创建AO对象(Activation Object)执行期上下文。
找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
将实参值和形参统一。
在函数体里面找函数声明,值赋予函数体。
全局预编译。
复制代码
1
2
3
4
5
6
7
8
9
10global = 100; function test(){ console.log(global); //undefined var global = 200; console.log(global);//200 var global = 300; } test(); var global;
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23function fn(a){ console.log(a); //根据AO对象中的数据第一个打印的是:fn() // 变量声明+变量赋值(只提升变量声明,不提升变量赋值) var a = 123; // 执行到这时,由于变量赋值是不提升的,所以函数被123覆盖了 console.log(a); // 123 // 函数声明 function a(){}; // 这里被提升上去了,可以忽略 console.log(a); // 123 // 函数表达式 var b = function(){}; console.log(b); // 根据AO对象中的数据:fn() // 函数 function d(){}; } //调用函数 fn(1);
最后
以上就是英俊嚓茶最近收集整理的关于js预编译的全部内容,更多相关js预编译内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复