一起来了解一下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 select选中的一个小问题
Oct 11 Javascript
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
May 02 Javascript
jQuery之按钮组件的深入解析
Jun 19 Javascript
把jquery 的dialog和ztree结合实现步骤
Aug 02 Javascript
简介alert()与console.log()的不同
Aug 26 Javascript
javascript每日必学之运算符
Feb 16 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
Mar 10 Javascript
jquery分页插件jquery.pagination.js使用方法解析
Apr 01 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
Aug 04 Javascript
JS将时间秒转换成天小时分钟秒的字符串
Jul 10 Javascript
es6中reduce的基本使用方法
Sep 10 Javascript
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
Sep 01 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
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
Symfony核心类概述
2016/03/17 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
详解phpstorm2020最新破解方法
2020/09/17 PHP
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
js跨域访问示例(客户端/服务端)
2014/05/19 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
JavaScript实现网页加载进度条代码超简单
2015/09/21 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
[01:30]我们共输赢 完美世界城市挑战赛开启全新赛季
2019/04/19 DOTA
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
10款最好的Web开发的 Python 框架
2015/03/18 Python
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
2019/06/04 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
Fox Racing英国官网:越野摩托车和山地自行车服装
2020/02/26 全球购物
社区网格化管理实施方案
2014/03/21 职场文书
促销活动总结范文
2014/04/30 职场文书
小学生读书活动总结
2014/06/30 职场文书
收款委托书
2014/10/14 职场文书
公司介绍信范文
2015/01/31 职场文书
入党转正申请报告
2015/05/15 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书
Redis可视化客户端小结
2021/06/10 Redis
详解MySQL多版本并发控制机制(MVCC)源码
2021/06/23 MySQL