当前位置:首页 > 日记 > 正文

JavaScript 详解预编译原理

JavaScript 详解预编译原理

JavaScript 预编译原理

今天用了大量时间复习了作用域、预编译等等知识

看了很多博文,翻开了以前看过的书(好像好多书都不会讲预编译)

发现当初觉得自己学的很明白,其实还是存在一些思维误区 (很多博文具有误导性)

今晚就整理了一下凌乱的思路

先整理一下预编译的知识吧,日后有时间再把作用域详细讲解一下

大家要明白,这个预编译和传统的编译是不一样的(可以理解js预编译为特殊的编译过程)

JavaScript是解释型语言,

既然是解释型语言,就是编译一行,执行一行

传统的编译会经历很多步骤,分词、解析、代码生成什么的

日后有时间再给大家科普

下面就给大家分享一下我所理解的JS预编译

JavaScript运行三部曲

脚本执行js引擎都做了什么呢?

  • 语法分析
  • 预编译
  • 解释执行

在执行代码前,还有两个步骤

语法分析很简单,就是引擎检查你的代码有没有什么低级的语法错误

解释执行顾名思义便是执行代码了

预编译简单理解就是在内存中开辟一些空间,存放一些变量与函数

理解了预编译对大家理解作用域同样有帮助

JS预编译什么时候发生

我当初思维误区也发生在这里

预编译到底什么时候发生

希望大家不要让上面的运行过程让你产生误会,

误以为预编译仅仅发生在script内代码块执行前

这倒并没有错

预编译确确实实在script代码内执行前发生了

但是它大部分会发生在函数执行前

JS预编译实例

举例前,先来思考一下这几个概念:

  • 变量声明 var…
  • 函数声明 function…
<script>  var a = 1;// 变量声明  function b(y){//函数声明    var x = 1;    console.log('so easy');  };  var c = function(){//是变量声明而不是函数声明!!    //...  }  b(100);</script><script>  var d = 0;</script>

让我们看看引擎对这段代码做了什么吧

1.页面产生便创建了GO全局对象(Global Object)(也就是大家熟悉的window对象)

2.第一个脚本文件加载

3.脚本加载完毕后,分析语法是否合法

4.开始预编译

查找变量声明,作为GO属性,值赋予undefined
查找函数声明,作为GO属性,值赋予函数体

//伪代码GO/window = {  //页面加载创建GO同时,创建了document、navigator、screen等等属性,此处省略  a: undefined,  c: undefined,  b: function(y){    var x = 1;    console.log('so easy');  }}

解释执行代码(直到执行函数b)

//伪代码GO/window = {  //变量随着执行流得到初始化  a: 1,  c: function(){    //...  },  b: function(y){    var x = 1;    console.log('so easy');  }}

执行函数b之前,发生预编译

  • 创建AO活动对象(Active Object)
  • 查找形参和变量声明,值赋予undefined
  • 实参值赋给形参
  • 查找函数声明,值赋予函数体
//伪代码AO = {  //创建AO同时,创建了arguments等等属性,此处省略  y: 100,  x: undefined}

解释执行函数中代码

第一个脚本文件执行完毕,加载第二个脚本文件

第二个脚本文件加载完毕后,进行语法分析

语法分析完毕,开始预编译

重复最开始的预编译步骤……

大家要注意,

预编译阶段发生变量声明和函数声明,没有初始化行为(赋值),匿名函数不参与预编译

只有在解释执行阶段才会进行变量初始化

嗯~最后收一下尾

总结

预编译(函数执行前)※

1. 创建AO对象(Active Object)
2. 查找函数形参及函数内变量声明,形参名及变量名作为AO对象的属性,值为undefined
3. 实参形参相统一,实参值赋给形参
4. 查找函数声明,函数名作为AO对象的属性,值为函数引用

预编译(脚本代码块script执行前)

1. 查找全局变量声明(包括隐式全局变量声明,省略var声明),变量名作全局对象的属性,值为undefined
3. 查找函数声明,函数名作为全局对象的属性,值为函数引用

理解了预编译对理解提升行为,this指向,作用域及性能等问题都有很大帮助

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

asp.net+FCKeditor上传显示叉叉无

asp.net+FCKeditor上传显示叉叉无

无法显示,上传,显示,解决方法,叉叉,弄了半天也没有找到原因,然后又重新到网上下载几个,还是不行,郁闷坏了,最后结合其他编辑器的用法,才知道是配置文件夹中上传文件夹的路径写错了 比如要上传到项目的根目录下的UserFiles下面,web.config的配置如…

ps设计魔幻绚丽的兔子和鹿重合头像

ps设计魔幻绚丽的兔子和鹿重合头像

教程,绚丽,头像,兔子,电脑软件,使用Photoshop设计魔幻绚丽的兔子和鹿重合头像,本次教程内容主要来自Ilya Shapko的作品,我非常欣赏他的这幅作品配色的绚丽,以及兔子和鹿相结合的魔幻效果。那么如何设计出这样的效果呢?我们需要注意哪些细节?有哪…

ps怎么制作信号干扰效果的?

ps怎么制作信号干扰效果的?

信号,干扰,效果,电脑软件,ps,干扰信号的时候画面是什么样子的呢?今天我们就来看看详细的制作方法软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-041、导入原图,并复制3层出来(背景就先隐藏好了)2、右键图层打…

Excel中2010版进行创建下拉菜单的

Excel中2010版进行创建下拉菜单的

下拉菜单,操作技巧,操作步骤,电脑软件,Excel,  Excel功能多多,满足人们日常应用的表格,像小编这边羊毛衫市场,各种进出货都是用纸记录容易丢。今天,小编就教大家在Excel中2010版进行创建下拉菜单的操作技巧。Excel中2010版进行创建下拉菜单的…

excel 2013激活的方法excel 2013怎

excel 2013激活的方法excel 2013怎

激活,方法,电脑软件,excel,strong,  用Excel朋友都知道,在用Excel之前都需要把Excel给激活了才可以用。或许有的朋友并不知道Excel2013该如何激活,如果不懂的朋友欢迎一起来学习探讨。下面是小编带来的关于excel 2013激活的方法,希望阅读过…

js实现滑动到页面底部自动加载更多

js实现滑动到页面底部自动加载更多

加载更多,页面,功能,电脑软件,js,话不多说,请看代码://滚动条到页面底部加载更多案例 $(window).scroll(function(){ var scrollTop = $(this).scrollTop(); //滚动条距离顶部的高度 var scrollHeight = $(document).height(); //当前页…

AI巧用艺术画笔制作绚丽艺术字教程

AI巧用艺术画笔制作绚丽艺术字教程

教程,巧用,绚丽,艺术,艺术字,效果图:主要过程:教程结束,以上就是AI巧用艺术画笔制作绚丽艺术字教程的全部内容,希望大家喜欢!相关教程推荐:AI艺术画笔制作GRUNGE特效文字AI制作超漂亮的艺术字体Illustrator(AI)设计制作漂亮的蓝色艺术字实例教程…

JS SetInterval 代码实现页面轮询

JS SetInterval 代码实现页面轮询

代码实现,页面,电脑软件,JS,SetInterval,概念介绍setInterval 是一个实现定时调用的函数,可按照指定的周期(以毫秒计)来调用函数或计算表达式。setInterval方法会不停地调用函数,直到 clearInterval 被调用或窗口被关闭。由 setInterval 返回的…

ai画布怎么旋转? ai图形画布的三种

ai画布怎么旋转? ai图形画布的三种

方法,图形,三种,电脑软件,ai,ai中想要旋转图形或者选注画布,该怎么操作呢?下面我们就来介绍三种方法,请看下文详细介绍软件名称:Adobe Illustrator CS5(ai软件下载)精简绿色免费版软件大小:111.56MB更新时间:2013-08-09方法一:旋转图形1、想要内容…

基于JavaScript实现移动端无限加载

基于JavaScript实现移动端无限加载

加载,移动端,无限,分页,电脑软件,本文实例为大家分享了js实现移动端无限加载分页的具体代码,供大家参考,具体内容如下原理:当滚动条到达底部时,执行下一页内容。判断条件需要理解三个概念: 1.scrollHeight 真实内容的高度 2.clientHeight …

PS详解电商产品电吹风机的后期精修

PS详解电商产品电吹风机的后期精修

教程,产品,电吹风,详解,后期,ps实操:PS详细解析电商产品电吹风机图片的后期精修思路时间:90分钟12 阅读全文教程结束,以上就是PS详解电商产品电吹风机图片的后期精修思路教程的全部内容,希望对你有所帮助!相关教程推荐:PS电商修图之吹风机产品修…

ES2015 正则表达式新增特性

ES2015 正则表达式新增特性

正则表达式,特性,电脑软件,ES2015 正则表达式新增特性:在原来正则表达式基础上,ES2015增强了对四字节unicode字符的支持等功能。更多正则表达式内容可以参阅正则表达式教程板块。一.RegExp构造函数的使用:在ES2015之前,使用RegExp构造函数创…