概述
- 预编译分为全局预编译和局部预编译,全局预编译发生在页面加载完成时执行,而局部预编译发生在函数执行的前一刻。
- 预编译阶段变量声明和函数声明,没有初始化行为(赋值),匿名函数不参与预编译 。只有在解释执行阶段才会进行变量初始化
- 首先JavaScript的执行过程会先扫描一下整体语法语句,如果存在逻辑错误或者语法错误,那么直接报错,程序停止执行,没有错误的话,开始从上到下解释一行执行一行。
- 全局预编译3个步骤:
创建GO对象(Global Object)全局对象。
找变量声明,将变量名作为GO属性名,值为undefined
查找函数声明,作为GO属性,值赋予函数体 - 局部预编译的4个步骤:
创建AO对象(Activation Object)执行期上下文。
找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
将实参值和形参统一。
在函数体里面找函数声明,值赋予函数体。
全局预编译。
global = 100;
function test(){
console.log(global); //undefined
var global = 200;
console.log(global);//200
var global = 300;
}
test();
var global;
function 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预编译所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复