一起来了解一下JavaScript的预编译(小结)


Posted in Javascript onMarch 01, 2021

JS运行三部曲

js运行代码共分三步

  • 语法分析
  • 预编译
  • 解释执行

JavaScript代码在运行时,首先会进行语法分析,通篇检查代码是否存在低级错误,然后进行预编译,整理内部的一个逻辑,最后再开始一行一行的执行代码

语法分析

代码在执行之前,系统会通篇扫描一遍,检查代码有没有低级的语法错误,比如少写个大括号。

预编译

预编译前奏

预编译发生在函数执行的前一刻。变量未经声明就赋值,此变量为全局对象所有

a = 3

var b = c = 4

一切声明的全局变量,全是window的属性

var a = 1 ===> window.a = 1

预编译四部曲

  1. 创建AO(Activation Object)对象(里面存储的是函数内部的局部变量)
  2. 找形参和变量声明,将变量和形参名做为AO属性名,值为undefined
  3. 将实参和形参统一
  4. 在函数体里面找函数声明,值赋予函数体

用一个例子来说明一下,也可以自己先给出一个答案,再继续往下看

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() {}
 console.log(d)
}
fn(1);

第一步,创建AO(Activation Object)对象 {}第二步,找形参和变量声明,将变量和形参名做为AO属性名,值为undefined

{
 a: undefined,
 b: undefined,
}

第三步,将实参和形参统一

{
 a: 1,
 b: undefined,
}

第四步,找函数声明,值赋予函数体

{
 a: function a() {},
 b: undefined,
 d: function d() {}
}

所以在函数fn执行的前一刻,a、b、d的值如上所示

所以fn(1)执行的结果为

// ƒ a() {}
// 123
// 123
// ƒ () {}
// ƒ d() {}

在全局作用域里,预编译过程有些许不同

  • 创建GO(Global Object)对象(里面存储的是函数内部的全局变量)GO === window
  • 找形参和变量声明,将变量和形参名做为GO属性名,值为undefined
  • 在函数体里面找函数声明,值赋予函数体

解释执行

一行一行的执行代码

实践题

这里有几个例题,有兴趣的可以看一下

function test(a, b) {
 console.log(a);
 console.log(b);
 var b = 234;
 console.log(b);
 a = 123;
 console.log(a);
 function a() {}
 var a;
 b = 234;
 var b = function() {};
 console.log(a);
 console.log(b);
}
test(1);
global = 100;
function fn() {
 console.log(global);
 global = 200;
 console.log(global);
 var global = 300;
}
fn();
var global;
function test() {
 console.log(b);
 if (a) {
  var b = 100;
 }
 c = 234;
 console.log(c);
}
var a;
test();
a = 10;
console.log(c);

总结

多数情况下,我们都是采用下面的这种方式来处理预编译的一个过程

  • 函数声明,整体提升
  • 变量声明,声明提升

若是遇见复杂的情况就只能采用最原始的方式来解决问题了

到此这篇关于一起来了解一下JavaScript的预编译(小结)的文章就介绍到这了,更多相关JavaScript 预编译内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
用jquery写的一个万年历(自写)
Jan 20 Javascript
JavaScript通过join函数连接数组里所有元素的方法
Mar 20 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
Aug 29 Javascript
基于Node.js的WebSocket通信实现
Mar 11 Javascript
JS随机数产生代码分享
Feb 24 Javascript
使用webpack搭建react开发环境的方法
May 15 Javascript
Vue.js点击切换按钮改变内容的实例讲解
Aug 22 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
Aug 25 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
Sep 11 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
Jun 04 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
Sep 16 Javascript
基于Cesium绘制抛物弧线
Nov 18 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
Mar 01 #Vue.js
three.js 实现露珠滴落动画效果的示例代码
Mar 01 #Javascript
详解js创建对象的几种方式和对象方法
Mar 01 #Javascript
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 #Vue.js
vue实现拖拽进度条
Mar 01 #Vue.js
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 #Vue.js
js闭包和垃圾回收机制示例详解
Mar 01 #Javascript
You might like
Smarty分页实现方法完整实例
2016/05/11 PHP
php网页版聊天软件实现代码
2016/08/12 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
2016/11/05 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
PHP yield关键字功能与用法分析
2019/01/03 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
JavaScript代码复用模式详解
2014/11/07 Javascript
封装了jQuery的Ajax请求全局配置
2015/02/05 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
聊聊JS动画库 Velocity.js的使用
2018/03/13 Javascript
使用微信SDK自定义分享的方法
2019/07/03 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
2020/07/28 Javascript
[02:17]DOTA2亚洲邀请赛 RAVE战队出场宣传片
2015/02/07 DOTA
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2018/10/21 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
英国在线电子和小工具商店:TecoBuy
2018/10/06 全球购物
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
介绍一下linux文件系统分配策略
2012/11/17 面试题
2014年民政局关于保密工作整改措施
2014/09/19 职场文书
英语感谢信范文
2015/01/20 职场文书
2015年教师节活动总结
2015/03/20 职场文书
初中毕业感言300字
2015/07/31 职场文书
《西门豹》教学反思
2016/02/23 职场文书
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android
Python中npy和mat文件的保存与读取
2022/04/24 Python