一起来了解一下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 相关文章推荐
HTML Dom与Css控制方法
Oct 25 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
Oct 16 Javascript
简单实现js选项卡切换效果
Feb 09 Javascript
详解Vue2 SSR 缓存 Api 数据
Nov 20 Javascript
JavaScript实现星级评价效果
May 17 Javascript
Vuex新手的理解与使用详解
May 31 Javascript
Vue拖拽组件列表实现动态页面配置功能
Jun 17 Javascript
在vue中使用echars实现上浮与下钻效果
Nov 08 Javascript
vue 动态表单开发方法案例详解
Dec 02 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
Feb 10 Javascript
详解node.js 事件循环
Jul 22 Javascript
Vue左滑组件slider使用详解
Aug 21 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
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
在php中使用sockets:从新闻组中获取文章
2006/10/09 PHP
深入探讨PHP中的内存管理问题
2011/08/31 PHP
20个PHP常用类库小结
2011/09/11 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
Zend Framework前端控制器用法示例
2016/12/11 PHP
Windows服务器中PHP如何安装redis扩展
2019/09/27 PHP
js同时按下两个方向键
2007/12/01 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
javascript中HTMLDOM操作详解
2014/12/11 Javascript
浅谈JS继承_寄生式继承 & 寄生组合式继承
2016/08/16 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
elementui的默认样式修改方法
2018/02/23 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
element vue Array数组和Map对象的添加与删除操作
2018/11/14 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
机电一体化应届生求职信范文
2014/01/24 职场文书
剪彩仪式主持词
2014/03/19 职场文书
法人代表授权委托书
2014/04/08 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
保密工作目标责任书
2014/07/28 职场文书
信访工作个人总结
2015/03/03 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers
Python数据类型最全知识总结
2021/05/31 Python