JavaScript 的编译原理
JavaScript 是一门编译语言。
JavaScript 的编译是发生在代码执行前的几微米(甚至更短)的事件内,所以 JavaScript 没有其他语言那么多的时间来进行优化。
当 JavaScript 执行 var a = 2 时,并不是我们理解的直接创建一个变量 a,并赋值为 2,实际上它分成了两个步骤进行(这样就很好地解释了声明提升):var a 和 a = 2;
在执行 var a = 2 时,编译器首先把它分解成词法单元,然后把词法单元拆解成抽象语法树(AST)。
当 JavaScript 进行编译的时候,编译器会询问当前作用域是否已经又一个名为 a 的变量,如果有,就忽略这个声明;否则就会在作用域的当前作用域的集合中声明一个新的变量,并命名为 a。
之后 JavaScript 引擎运行的时候,就会询问当前作用域集合中有没有一个叫 a 的变量,如果有,JavaScript 的引擎就会使用这个变量,如果没有,就会向上一个作用域继续寻找叫 a 的变量。如果找到了 a,就会给它赋值 2。如果一直没有找到,JavaScript 引擎就会抛出一个异常。
需要注意的点:
我们在理解:function foo(a){} 的时候,经常理解成 var foo,foo = function(a){},但实际上这是不对的,函数的声明并不能简单地以 LHS 查询和赋值的形式进行理解。
内容扩展:
- 抽象语法树:
抽象语法树会有一个叫做 VariableDeclaration 的顶级节点;然后会有一个叫做 Identifier 的子节点,这个子节点的值是 a;以及一个叫做 AssignmentExpression 的子节点。而 AssignmentExpression 又会有一个 NumericLiteral 的子节点,这个子节点的值是 2。
- LHS 和 RHS 查询
LHS 查询会找到变量的容器本身;
RHS 查询则是简单地查找到某个变量的值。
JavaScript 的编译原理的更多相关文章
- JavaScript的编译原理
尽管通常将 JavaScript 归类为“动态”或“解释执行”语言,但事实上它是一门编译语言.这个事实对你来说可能显而易见,也可能你闻所未闻,取决于你接触过多少编程语言,具有多少经验.但与传统的编译语 ...
- JavaScript预编译原理分析
一直对变量对象,活动对象,预编译,变量提升,执行上下文的时间顺序有着凌乱的认识,但是这些对理解JS语法有着很重要的作用.读了很多人的文章,都没有一个特别清晰的把这些写出来. 今天主要总结一下现阶段自己 ...
- 浅谈JavaScript预编译原理
这两天又把js的基础重新复习了一下,很多不懂得还是得回归基础,大家都知道js是解释性语言,就是编译一行执行一行,但是在执行的之前,系统会做一些工作: 1,语法分析: 2,预编译: 3,解释执行. 语法 ...
- 学了编译原理能否用 Java 写一个编译器或解释器?
16 个回答 默认排序 RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...
- 跟vczh看实例学编译原理——一:Tinymoe的设计哲学
自从<序>胡扯了快一个月之后,终于迎来了正片.之所以系列文章叫<看实例学编译原理>,是因为整个系列会通过带大家一步一步实现Tinymoe的过程,来介绍编译原理的一些知识点. 但 ...
- javascript引擎工作原理
1. 什么是JavaScript解析引擎? 简单地说,JavaScript解析引擎就是能够“读懂”JavaScript代码,并准确地给出代码运行结果的一段程序.比方说,当你写了 var a = 1 + ...
- JavaScript模板引擎原理
JavaScript模板引擎原理,几行代码的事儿 2013-12-03 16:35 by BarretLee, 650 阅读, 6 评论, 收藏, 编辑 一.前言 什么是模板引擎,说的简单点,就是一个 ...
- Knowledge Point 20180303 对比编译器、解释器与Javac编译原理
编译器与Javac编译原理 在前文我们知道了Java是一种编译语言和解释语言,它的源代码经过编译器Javac编译为能够被JVM识别的二进制语言,然后JVM将其解释为能够被平台识别的机器语言.那么什么是 ...
- Stanford公开课《编译原理》学习笔记(2)递归下降法
目录 一. Parse阶段 CFG Recursive Descent(递归下降遍历) 二. 递归下降遍历 2.1 预备知识 2.2 多行语句的处理思路 2.3 简易的文法定义 2.4 文法产生式的代 ...
随机推荐
- Kotlin 中类函数
在kotlin中函数可以在类外部定义也可以在类内部定义,前者即为全局函数,后者,是类成员函数,语法一样 package loaderman.demo class Person { fun demo(n ...
- OpenCL使用CL_MEM_USE_HOST_PTR存储器对象属性与存储器映射
随着OpenCL的普及,现在有越来越多的移动设备以及平板.超级本等都支持OpenCL异构计算.而这些设备与桌面计算机.服务器相比而言性能不是占主要因素的,反而能耗更受人关注.因此,这些移动设备上的GP ...
- 19.网络插件calico
19.网络插件calico 官网: https://docs.projectcalico.org/v3.8/introduction/ calico默认工作在192.168.0.0/16 的网络 ca ...
- c++ new bad_alloc
try { for (int i = 0; i<1000; i++) { test1 = new Test(); cout << i << " new dog ...
- 独立的js文件中不能使用EL表达式取值
在独立的js文件中写了一个EL表达式取值,发现没有取到值,原因在于不能在独立的js文件中使用EL表达式,可以在jsp页面定义全局变量,然后在js文件中引用
- Elasticsearch删除数据操作,你必须知道的一些坑
前两天有同事打电话问我,说ES删除数据有没有什么坑? 我当时就问,是删索引还是删索引里的数据?她回答说是删数据,我说查出这些数据直接删除就好了,没有什么坑... 后来想想,关于ES数据的删除,之前确实 ...
- linux 文件赋权限
chown tomcat:tomcat /logs chmod 766 /logs
- Dart Language samples
Hello World Every app has a main() function. To display text on the console, you can use the top-lev ...
- Win10 企业版 激活 批处理
cd %SystemRoot%\System32 wscript.exe slmgr.vbs /upk wscript.exe slmgr.vbs /ipk NPPR9-FWDCX-D2C8J-H87 ...
- Cracking the coding interview目录及资料收集
前言 <Cracking the coding interview>是一本被许多人极力推荐的程序员面试书籍, 详情可见:http://www.careercup.com/book. 第六版 ...