一起来了解一下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 相关文章推荐
转一个日期输入控件,支持FF
Apr 27 Javascript
js下获取div中的数据的原理分析
Apr 07 Javascript
jquery 新浪网易的评论块制作
Jul 01 Javascript
JS的replace方法详细介绍
Nov 09 Javascript
关于JQuery($.load)事件的用法和分析
Apr 09 Javascript
JS实现遮罩层效果的简单实例
Nov 12 Javascript
JQuery教学之性能优化
May 14 Javascript
javascript基本语法
May 31 Javascript
Highcharts学习之数据列
Aug 03 Javascript
JQuery中Ajax的操作完整例子
Mar 07 Javascript
使用javascript做在线算法编程
May 25 Javascript
原生js实现公告滚动效果
Jan 10 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遍历文件夹和文件列表示例分享
2014/03/11 PHP
PHP微框架Dispatch简介
2014/06/12 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
syntaxhighlighter 使用方法
2007/07/02 Javascript
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
javascript实现微信分享
2014/12/23 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
javascript this详细介绍
2016/09/19 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
2018/03/20 Javascript
基于Angular中ng-controller父子级嵌套的相关属性详解
2018/10/08 Javascript
node上的redis调用优化示例详解
2018/10/30 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
python实现发送邮件功能
2017/07/22 Python
将Python文件打包成.EXE可执行文件的方法
2019/08/11 Python
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
Unix如何添加新的用户
2014/08/20 面试题
银行领导证婚词
2014/01/11 职场文书
企业内控岗位的职责
2014/02/07 职场文书
大学团日活动新闻稿
2014/09/10 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
抢劫罪辩护词
2015/05/21 职场文书
你真的了解PHP中的引用符号(&)吗
2021/05/12 PHP
python基础之类属性和实例属性
2021/10/24 Python
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL