一起来了解一下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 相关文章推荐
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
Sep 19 Javascript
12个非常有创意的JavaScript小游戏
Mar 18 Javascript
按给定几率进行随机抽取的js代码
Dec 28 Javascript
读jQuery之八 包装事件对象
Jun 21 Javascript
jquery 插件开发 extjs中的extend用法小结
Jan 04 Javascript
ExtJS如何设置与获取radio控件的选取状态
Jan 22 Javascript
JavaScript实现获取dom中class的方法
Feb 09 Javascript
浅谈Javascript中substr和substring的区别
Sep 30 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
May 30 Javascript
JS实现类似百叶窗下拉菜单效果
Dec 30 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
Apr 13 Javascript
Angular PWA使用的Demo示例
Jan 31 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
2006/12/14 PHP
解析coreseek for sphinx的使用
2013/06/21 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
Zend Framework缓存Cache用法简单实例
2016/03/19 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
2018/06/05 PHP
php报错502badgateway解决方法
2019/10/11 PHP
框架页面高度自动刷新的Javascript脚本
2013/11/01 Javascript
从零学JSON之JSON数据结构
2014/05/19 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
JavaScript数组常用操作技巧汇总
2014/11/17 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
javascript跨域总结之window.name实现的跨域数据传输
2015/11/01 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
浅析BootStrap栅格系统
2016/06/07 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
Bootstrap基本组件学习笔记之进度条(15)
2016/12/08 Javascript
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
vue用elementui写form表单时,在label里添加空格操作
2020/08/13 Javascript
React Ant Design树形表格的复杂增删改操作
2020/11/02 Javascript
Python制作刷网页流量工具
2017/04/23 Python
pandas获取groupby分组里最大值所在的行方法
2018/04/20 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
新手入门Python编程的8个实用建议
2019/07/12 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
技术人员面试提纲
2013/11/28 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
房屋租赁意向书范本
2015/05/09 职场文书
婚宴新郎致辞
2015/07/28 职场文书
导游词之北京明十三陵
2019/10/28 职场文书