一起来了解一下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 相关文章推荐
accesskey 提交
Jun 26 Javascript
传智播客学习之java 反射
Nov 22 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
Aug 13 Javascript
js获取及修改网页背景色和字体色的方法
Dec 29 Javascript
微信小程序 生命周期函数详解
May 24 Javascript
JavaScript在控件上添加倒计时功能的实现代码
Jul 04 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
Aug 02 Javascript
jQuery完成表单验证的实例代码(纯代码)
Sep 30 jQuery
vue.js中$set与数组更新方法
Mar 08 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
Apr 28 jQuery
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
Apr 30 Javascript
jquery制作的移动端购物车效果完整示例
Feb 24 jQuery
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中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
如何使用Strace调试工具
2013/06/03 PHP
php生成RSS订阅的方法
2015/02/13 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
JavaScript 数组循环引起的思考
2010/01/01 Javascript
Jquery cookie操作代码
2010/03/14 Javascript
js弹出层之1:JQuery.Boxy (二)
2011/10/06 Javascript
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
微信小程序 侧滑删除(左滑删除)
2017/05/23 Javascript
node使用UEditor富文本编辑器的方法实例
2017/07/11 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
vue2.0与bootstrap3实现列表分页效果
2017/11/28 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
Vue使用lodop实现打印小结
2019/07/06 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
[47:48]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第三局
2016/02/28 DOTA
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
Python3爬虫ChromeDriver的安装实例
2021/02/06 Python
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
Java模拟试题
2014/11/10 面试题
办公室保洁员岗位职责
2013/12/02 职场文书
会计系毕业求职信
2014/08/07 职场文书
故宫的导游词
2015/01/31 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
培训督导岗位职责
2015/04/10 职场文书
60条职场经典语录,总有一条能触动你的心
2019/08/21 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang
python 实现图片特效处理
2022/04/03 Python
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers