一起来了解一下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 相关文章推荐
关于恒等于(===)和非恒等于(!==)
Aug 20 Javascript
jQuery UI Dialog控件中的表单无法正常提交的解决方法
Dec 19 Javascript
25个非常棒的jQuery滑块插件和教程小结
Sep 02 Javascript
js 幻灯片的实现
Dec 06 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
Dec 07 Javascript
jQuery获取checkbox选中的值
Jan 28 Javascript
jquery仿QQ登录账号选择下拉框效果
Mar 22 Javascript
BootStrapValidator初使用教程详解
Feb 10 Javascript
js传递数组参数到后台controller的方法
Mar 29 Javascript
浅谈微信小程序flex布局基础
Sep 10 Javascript
微信小程序 冒泡事件原理解析
Sep 27 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
May 26 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
谏山创故乡大分县日田市水坝将设立《进击的巨人》立艾伦、三笠以及阿尔敏的铜像!
2020/03/06 日漫
用PHP实现维护文件代码
2007/06/14 PHP
比较全的PHP 会话(session 时间设定)使用入门代码
2008/06/05 PHP
php 注释规范
2012/03/29 PHP
深入了解PHP类Class的概念
2012/06/14 PHP
JavaScript中的细节分析
2012/06/30 Javascript
jquery实现预览提交的表单代码分享
2014/05/21 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
编写React组件项目实践分析
2018/03/04 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
2019/08/28 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
python-Web-flask-视图内容和模板知识点西宁街
2019/08/23 Python
Python3.7安装keras和TensorFlow的教程图解
2020/06/18 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
记帐员岗位责任制
2014/02/08 职场文书
情况说明书格式范文
2014/05/06 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
出差报告格式模板
2014/11/06 职场文书
销售会议开幕词
2015/01/28 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
React如何使用axios请求数据并把数据渲染到组件
2022/08/05 Javascript