我是靠谱客的博主 明亮泥猴桃,最近开发中收集的这篇文章主要介绍js 预编译 GO与AO 变量和函数声明提升,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

预编译

预编译分为全局(GO)预编译和局部(AO)预编译,全局预编译发生在页面加载完成时执行,而局部预编译发生在函数执行的前一刻。

js运行三步曲

首先JavaScript的执行过程会先扫描一下整体语法语句,如果存在逻辑错误或者语法错误,那么直接报错,程序停止执行,没有错误的话,开始从上到下解释一行执行一行。

1 语法分析
2 预编译
3 解释执行

局部预编译(AO)的4个步骤

  1. 在执行的前一刻会创建一个ao对象
  2. 将函数内所有的形参和变量声明储存到ao对象中,value为undefined;
  3. 将形参和实参进行统一。
  4. 将所有的函数声明的函数名作为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 变量和函数声明提升所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部