概述
预编译
预编译分为全局(GO)预编译和局部(AO)预编译,全局预编译发生在页面加载完成时执行,而局部预编译发生在函数执行的前一刻。
js运行三步曲
首先JavaScript的执行过程会先扫描一下整体语法语句,如果存在逻辑错误或者语法错误,那么直接报错,程序停止执行,没有错误的话,开始从上到下解释一行执行一行。
1 语法分析
2 预编译
3 解释执行
局部预编译(AO)的4个步骤
- 在执行的前一刻会创建一个ao对象
- 将函数内所有的形参和变量声明储存到ao对象中,value为undefined;
- 将形参和实参进行统一。
- 将所有的函数声明的函数名作为ao对象中的key,函数整体内容作为value
全局预编译(GO)的3个步骤
1. 创建GO(Global Object)对象;
2. 寻找变量声明作为GO的属性名,并赋值为undefined;
3. 寻找函数声明,放入作为GO的属性,并赋值为其函数体。
由于全局中没有参数的的概念,所以省去了实参形参相统一这一步。
注意
函数提升只会提升函数声明,而不会提升函数表达式
函数声明:function fun(){}
函数表达式:var fun1=function(){}
例子AO
// 函数
function fn(a){
console.log(a);
// 变量声明+变量赋值(只提升变量声明,不提升变量赋值)
var a = 123;
console.log(a);
// 函数声明
function a(){};
console.log(a);
// 函数表达式
var b = function(){};
console.log(b);
// 函数
function d(){};
}
//调用函数
fn(1);
步骤
1 创建AO对象
AO{}
2 找形参和变量声明,将形参名和变量名作为AO对象的属性名
AO{
a : undefined,
b : undefined
}
3 将实参值和形参统一
AO{
a : 1,
b : function(){…}
}
4 在函数体里面找函数声明,值赋予函数体。
AO{
a : function a(){…},
b : undefined,
d : function d(){…}
}
结果
// 函数
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 预编译 GO与AO 变量和函数声明提升的全部内容,希望文章能够帮你解决js 预编译 GO与AO 变量和函数声明提升所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复