一、前言

js的预编译,是js的基础内容,学好预编译,很多js开发问题都会迎刃而解。
js在浏览器环境中运行流程一般分为三步走:

  1. 语法分析(检查代码的语法错误)
  2. 预编译(初始化变量和函数)
  3. 代码执行

js在预编译会在代码执行前一刻执行,同时会创建对象“全局上下文GO”,遇到函数时会创建对象“函数上下文AO”。

二、暗示全局变量(imply global variable)

暗示全局变量是js预编译的特点,顾名思义,就是在js中,如果变量没有声明就赋值,该变量就会被默认成为全局变量。
代码:

function foo(){a = 1;var b = 2;
}
foo()
console.log(a);  //  1
console.log(b);  //   报错 b is not defined

解读:1、foo函数内部将a变量直接赋值,默认该变量为全局变量,所以在函数外部可以打印出a;
2、变量b为函数内部声明的变量,全局上下文无法访问到,所以会报错;

三、全局上下文对象 GO (global object)

js预编译开始时,会创建一个对象GO,等同于全局对象window,用来存放初始化全局对象和函数;
步骤:

  1. 创建GO
  2. 将var声明的变量名作为GO对象的属性名,值为undefinded;
  3. 将声明函数的函数明作为GO对象的属性名,值为函数体;

代码:

console.log(a);  // undefinded
var a = 1;
console.log(a); // 1
console.log(foo);  // ƒ foo(){}
function foo(){};

解读:根据预编译步骤可得
1、创建GO对象;
2、寻找var声明的变量,并赋值为undefinded
GO {
a:undefind,
}
3、寻找函数声明,并赋值为函数体
GO {
a:undefind,
foo:foo(){}
}
预编译结束,开始执行代码,
第一行 a输出为undefinded;
第二行 a赋值为1,更新GO{
a:undefinded---->1,
foo:foo(){}
}
第三行 a输出1;
第四行 foo输出 foo(){};

四、函数上下文对象AO(activation object)

在函数执行前执行函数预编译,此时会产生一个AO对象,AO对象保存该函数的参数及内部变量。
步骤:
1、创建AO对象
2、将函数的参数以及函数里面声明的变量当做AO对象的属性名,值全部为undefined。
3、将实参的值赋值给形参。
4、在函数里面声明的函数,函数名作为AO对象的属性名,值赋值给函数体。(若参数名和函数名重叠,则函数体值会覆盖参数值)

代码:

console.log(a);  // undefinded
var a = 2;
foo(3);
function foo(b){console.log(b)  //  ƒ b(){}console.log(a);  //  undefindedvar a = 1;console.log(a)  // 1function b(){}
}
console.log(a)  // 2

解读:根据预编译步骤可得
1、创建GO对象;
2、寻找var声明的变量,并赋值为undefinded
GO{
a:undefinded
}
3、寻找函数声明,并赋值为函数体
GO{
a:undefinded
foo:foo(){}
}
开始执行代码
第一行 全局变量a输出 undefinded
第二行 全局变量a赋值为2
第三行 执行前 局部预编译 生成AO

开始局部预编译
1、创建AO对象;
2、将函数的参数以及函数里面声明的变量当做AO对象的属性名,值全部为undefined
AO{
b:undefinded,
a:undefinded
}
3、将实参的值赋值给形参
AO{
b:undefinded —> 3,
a:undefinded
}
4、在函数里面声明的函数,函数名作为AO对象的属性名,值赋值给函数体。(若参数名和函数名重叠,则函数体值会覆盖参数值)
AO{
b:undefinded —>3 —>b(){},
a:undefinded
}
局部预编译结束,继续执行代码
第五行 局部变量 b输出 b(){};
第六行 局部变量 a输出 undefinded;
第七行 局部变量 a 赋值1
AO{
b:undefinded —>3 —>b(){},
a:undefinded —>1
}
第八行 输出局部变量a为1;
第十一行 输出全局变量a为2;

结束。

js预编译 GO 和AO相关推荐

  1. js 预编译 AO对象跟GO对象

    注:GO对象会比AO对象先编译:预编译指在执行前会先预编译一次 GO对象 用于存放全局变量也称为全局作用域 <script>var name = '为空'var obg = {name:' ...

  2. AO是什么?GO是什么?深度解析JS预编译遇见AO和GO

    写在前面 三月结束了,四月开始了.希望这个世界早点好起来. 今天是个好日子,好呀嘛好日子.哈哈哈哈哈哈,省里发文件了,终于让我看到了开学的希望,心情格外的舒适. 好了好了,来说说今天都干嘛了吧.今天又 ...

  3. js 预编译 解释执行 作用域链 闭包

    <script>var a,b = 1;function c(x){var aa = 2;function d(){var ab = 3;}}var d = function(){//.. ...

  4. 将js预编译熟稔于心

    首先来看两个小例子: 第一个 test();function test(){console.log("能执行吗?") } 执行结果: 是不是感觉不应该打印出?why?就是因为有预编 ...

  5. 函数的作用域以及预编译

    一.函数的作用域 函数作用域有点像单面镜(外面看不到里面,里面可以看到外面) JS的特点:单线程.是 解释性语言 (翻译一行,执行一行) 二.预解析 JS预解析三部曲:语法解析 ⇒ 预编译 ⇒ 解释执 ...

  6. JS中的预编译(AO、GO详解)

    文章目录 一.由实例引发的思考 二.全局上下文GO: 三.函数上下文AO: 四.全局上下文GO+函数上下文AO: 总结 执行js文件的流程: ①通篇检查语法错误 ②预编译 ③解释一行执行一行 一.由实 ...

  7. JS数据类型及函数的预编译

    1.JS总体上分为:原始值和引用值 原始值分为:Number.Boolean.String.undefined.null;原始值不可改变的值,存储在栈[stack]的,先进后出! 引用值:array. ...

  8. js中立即执行函数会预编译吗_JavaScript预编译过程

    什么是预编译? 当js代码执行时有三个步骤: 1.语法分析,这个过程检查出基本的语法错误. 2,预编译,为对象分配空间. 3,解释执行,解释一行执行一行,一旦出错立即停止执行. 预编译发生在代码执行的 ...

  9. AO对象与GO对象——预编译(1)

    文章目录 JS引擎都做了什么? 函数声明提升 var关键字的声明提升,赋值不提升 一个奇奇怪怪的例子 暗示全局变量 AO对象 GO对象 AO和GO综合练习 JS引擎都做了什么? 1.检查通篇的语法错误 ...

最新文章

  1. DirectX903D 颜色
  2. js不完全入门之数组
  3. Tiray.SMSTiray.SMSTiray.SMSTiray.SMSTiray.SMSTiray.SMS
  4. Server Installation for Jitsi Meet 2
  5. python爬虫线上编辑_Python 爬虫入门《中》
  6. 嗅探工具 --- wireshark、tcpdump、dsniff、ettercap、bettercap、netsniff-ng
  7. 频域采样与恢复matlab实验,实验二 时域采样与频域采样及MATLAB程序
  8. 复杂性思维第二版 三、小世界图
  9. 如何使用git上传项目至GitHub repository
  10. 折叠屏显示器比折叠屏手机更有价值
  11. RISC-V数据模型,-mabi=ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d
  12. 锦溪:恬淡如少女的千年古镇
  13. 鼠标侧键设置工具X-Mouse安装教程
  14. SFR解析算法 - SFR_Calculation (C语言)
  15. 创业中的“投名状”—leo看赢在中国(2)
  16. 基于UDP的多播(组播)文件传输
  17. cv2.imshow()显示图片未响应,以及cv2.imwrite()黑图问题
  18. Julien Nioche谈Apache Nutch 2的特性及产品路线图
  19. GD32F405RGT6ADC外部触发DMA(固件库)
  20. 解决plink报错:.bim file has a split chromosome. Use --make-bed by itself to remedy this.

热门文章

  1. 考研名校压分黑名单——斯基
  2. 3.2.2对中文的考察2
  3. mysql applier_新特性解读 | MySQL 8.0.18 有权限控制的复制
  4. 中秋元宵猜灯谜_猜字谜微信小程序源码
  5. 1985年的图灵奖获得者-Richard Manning Karp
  6. 安装Anaconda遇到问题--NSIS Error
  7. Linux修改用户名后,每次开机提示configure it with blueman-service解决方法
  8. 用计算机制作微课教学教案,微课教案设计
  9. GNU Autotools [一]
  10. BLOCK层代码分析(9)IO下发之IO下发