JavaScript 详解预编译原理


Posted in Javascript onJanuary 22, 2017

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指向,作用域及性能等问题都有很大帮助

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

Javascript 相关文章推荐
给应用部分的js代码设定一个统一的入口
Jun 15 Javascript
jquery实现动静态条形统计图
Aug 17 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
Mar 30 Javascript
AngularJS教程之MVC体系结构详解
Aug 16 Javascript
jquery中用jsonp实现搜索框功能
Oct 18 Javascript
JavaScript中数据类型转换总结
Dec 25 Javascript
微信小程序request出现400的问题解决办法
May 23 Javascript
jquery+css实现下拉列表功能
Sep 03 jQuery
jQuery结合jQuery.cookie.js插件实现换肤功能示例
Oct 14 jQuery
layer弹出层自适应高度,垂直水平居中的实现
Sep 16 Javascript
layui table 获取分页 limit的方法
Sep 20 Javascript
jQuery 筛选器简单操作示例
Oct 02 jQuery
JavaScript中匿名函数的递归调用
Jan 22 #Javascript
Javascript中字符串和数字的操作方法整理
Jan 22 #Javascript
loading动画特效小结
Jan 22 #Javascript
全面总结Javascript对数组对象的各种操作
Jan 22 #Javascript
通过jsonp获取json数据实现AJAX跨域请求
Jan 22 #Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
Jan 22 #Javascript
node.js基于mongodb的搜索分页示例
Jan 22 #Javascript
You might like
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
PHPMAILER实现PHP发邮件功能
2018/04/18 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
js中哈希表的几种用法总结
2014/01/28 Javascript
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
2015/05/11 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
JS闭包用法实例分析
2017/03/27 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
JavaScript面向对象精要(下部)
2017/09/12 Javascript
Angular 5.x 学习笔记之Router(路由)应用
2018/04/08 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
layui table 参数设置方法
2018/08/14 Javascript
Vuex 快速入门(简单易懂)
2018/09/20 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
Python生成器(Generator)详解
2015/04/13 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
详解常用查找数据结构及算法(Python实现)
2016/12/09 Python
浅谈Pandas中map, applymap and apply的区别
2018/04/10 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
python的json包位置及用法总结
2020/06/21 Python
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
加拿大品牌鞋包连锁店:Little Burgundy
2021/02/28 全球购物
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
岗位职责的含义
2013/11/17 职场文书
投标保密承诺书
2014/05/19 职场文书
优秀毕业生求职信
2014/06/05 职场文书
报名委托书
2015/01/29 职场文书
汉语拼音教学反思
2016/02/22 职场文书
Python音乐爬虫完美绕过反爬
2021/08/30 Python
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python
python中 .npy文件的读写操作实例
2022/04/14 Python