一起来了解一下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 相关文章推荐
javascript 防止刷新,后退,关闭
Aug 07 Javascript
了解了这些才能开始发挥jQuery的威力
Oct 10 Javascript
分享我的jquery实现下拉菜单心的
Nov 29 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
Jan 04 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
Sep 10 Javascript
Webpack框架核心概念(知识点整理)
Dec 22 Javascript
详解Vue 事件修饰符capture 的使用
Dec 29 Javascript
在vue2.0中引用element-ui组件库的方法
Jun 21 Javascript
JS实现移动端触屏拖拽功能
Jul 31 Javascript
了解JavaScript中let语句
May 30 Javascript
Vue + Element UI图片上传控件使用详解
Aug 20 Javascript
使用webpack搭建vue环境的教程详解
Dec 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
php5新改动之短标记启用方法
2008/09/11 PHP
PHP提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
深入理解PHP 数组之count 函数
2016/06/13 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
2017/06/11 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
Extjs gridpanel 出现横向滚动条问题的解决方法
2011/07/04 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
javascript实现youku的视频代码自适应宽度
2015/05/25 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
canvas绘制的直线动画
2017/01/23 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
jQuery实现简单的回到顶部totop功能示例
2017/10/16 jQuery
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
微信小程序修改数组长度的问题的解决
2019/12/17 Javascript
[52:03]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第三场 1月31日
2021/03/11 DOTA
Python中用altzone()方法处理时区的教程
2015/05/22 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
在python中bool函数的取值方法
2018/11/01 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
对Python 中矩阵或者数组相减的法则详解
2019/08/26 Python
美国CVS药店官网:CVS Pharmacy
2018/07/26 全球购物
软件测试工程师结构化面试题库
2016/11/23 面试题
大学生应聘推荐信范文
2013/11/19 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
请假条的格式
2014/04/11 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
党的群众路线教育实践活动实施方案
2014/10/31 职场文书
学生会个人总结范文
2015/02/15 职场文书
歌咏比赛口号大全
2015/12/25 职场文书
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python
python字典进行运算原理及实例分享
2021/08/02 Python