关于JavaScript的编译原理

引擎:负责整个js程序的编译和执行过程
编译器:负责语法分析和代码生成
作用域:收集和维护一系列查询(由所有声明的标识符组成)

【例子:声明一个变量并赋值 var a = value;】

Step1.编译器对该程序段分解成词法单元 "var" 、"a"、 "="、 "value"、";"

Step2.编译器对以上的词法单元解析成一个树结构(抽象语法树AST)
AST
javascript的语法解析器Espsrima提供了一个在线解析的工具

在过程中,编译器询问作用域是否已经存在一个以"a"命名的变量在同一个作用域的集合中?若YES -> 编译器忽略该声明,继续编译;若NO -> 编译器要求作用域在当前作用域的集合中声明一个新变量,命名为a

Step3.编译器生成处理 赋值操作“a = 2”的代码

Step4.引擎运行step3生成的代码时会询问作用域,在当前作用域的集合中是否存在一个叫"a"的变量?若YES -> 引擎使用变量a ->Step5;若NO -> 引擎沿着作用域链继续查找变量a ->Step6

Step5.引擎执行编译器生成的代码,把2赋值给变量a

Step6.引擎抛出一个异常

【总结】变量的赋值会经过两个阶段:
1.编译器在作用域中声明一个变量(若之前未声明过)
2.运行时引擎在作用域中查找该变量

【扩展】
Step4中引擎查询变量有两种类型:LHS 和 RHS
LHS: 找到变量的容器本身
RHS:找到变量的值

例子:

function foo(a){var b = a;return a+b}
var c = foo(2);//在该例子中,LHS有:a = 2 、c= 、b=
//RHS有:=foo(2)、 =a、a+、+b

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

safari检查元素_如何防止Safari检查是否使用Apple Pay

safari检查元素Apple Pay’s incorporation into macOS Sierra makes it really easy to pay using the service on your Mac with your iPhone or iPad. But that doesn’t mean just because you can, you will, or will want to use Apple Pay in the future. 通过将Apple P…

某乎有人问--微软会抛弃C#吗,有点担心?

在某乎有人问:微软会抛弃C#吗,有点担心?,类似这样的问题,一直都有很多人在问,今天我们就来聊聊这个问题。没必要担心微软倒闭了,C#都不会消失,其实.Net已经不属于微软的了。C#是属于…

icloud上传错误_如何修复HomeKit“地址未注册到iCloud”错误

icloud上传错误While Apple has made serious improvements to the HomeKit smarthome framework, there are still more than a few ghosts in the machine. Let’s look at how to banish the extremely frustrating “Address is not registered with iCloud” error to get…

(3)Python3笔记之变量与运算符

一、变量 1). 命名规则: 1. 变量名不能使用系统关键字或保留关键字 2. 变量区分大小写 3. 变量命名由字母,数字,下划线组成但不能以数字开头 4. 不需要声明变量类型 是 a 1 非 int a 1 5. 查看变量内存地址 id(a), id(b) 6…

WPF 实现视频会议与会人员动态布局

WPF 实现视频会议与会人员动态布局控件名:SixGridView作 者:WPFDevelopersOrg - 驚鏵原文链接[1]:https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用.NET40;Visual Studio 2019;接着上一篇是基于Grid实现的视频查看感…

chromebook刷机_如何获取Android应用以查看Chromebook上的外部存储

chromebook刷机Android apps are a great way to expand the sometimes limited capabilities of Chromebooks, but they can be a problem if you store most of your data on an external medium—like an SD card, for example. Android应用程序是扩展Chromebook有时有限功能…

android 指纹添加_如何将手势添加到Android手机的指纹扫描仪

android 指纹添加So you have a shiny new Android phone, equipped with a security-friendly fingerprint scanner. Congratulations! But did you know that, while useful on its own, you can actually make the fingerprint scanner do more than just unlock your phone…

百度高管:问心无愧

1月23日下午消息,今天下午,百度召开百家号2019内容创作者盛典,百度副总裁沈抖出席并发布演讲。 就在前一天,一篇名为《搜索引擎百度已死》的文章刷屏,文中提到百度搜索有一半以上会指向百度自家产品,尤其百…

Vuex 学习笔记

Vuex 是什么? Vuex 是一个专为 Vue.js应用程序开发的状态管理模式。由于SPA应用的模块化,每个组件都有它各自的数据(state)、视图(view)和方法(actions),当项目内容越来越…

xdf文档怎么转换为pdf_如何将PDF文件和图像转换为Google文档文档

xdf文档怎么转换为pdfYou probably know you can create and edit documents with Google Docs, but you can edit more than just .doc files. Google Drive can also convert any PDF, JPG, PNG, or GIF into a document with fully editable text. Here’s how. 您可能知道可…

在现代 Windows 上使用经典 Windows 2000、XP、Vista 任务栏

你好,这里是 Dotnet 工具箱,定期分享 Dotnet 有趣,实用的工具和组件,希望对您有用!前言您第一次使用的 Windows 是哪个版本的?我最早使用的 Windows XP,然后再经过 XP、7、8/8.1 、Windows 10&a…

airdroid黑屏_如何使用AirDroid从PC控制Android设备

airdroid黑屏AirDroid for Android replaces your USB cable for connecting to your PC. Transfer files back and forth, send text messages, play music, view your photos, and manage applications using a web browser or a desktop client. 适用于Android的AirDroid取代…

分析java程序

2019独角兽企业重金招聘Python工程师标准>>> 最近公司的一个账单推送的服务,发现有延迟。我排查的时候发现,有一个程序日志不动了(采用消息队列,部署了两台服务器来负载均衡)。 网上说: jstack …

环境部署(九):linux下安装python+chrome+Xvfb

在基于selenium进行的UI自动化测试中,开发调试环境一般都是windows操作系统。完成后需要部署到专门的测试环境。 如要要部署到linux环境的服务器(阿里云、腾讯云)执行,那么测试脚本也需要对应的浏览器支持, 才能正常进…

地理围栏_什么是“地理围栏”?

地理围栏The term is popping up more frequently in news articles, appearing in product manuals, and highlighted as a feature in tons of mobile applications, but what exactly is geofencing? Read on as we explain what it is, why it’s appearing in more produ…

嵌套映射

1. 多对一嵌套查询映射使用案例 package com.zixue.dao;import com.zixue.annotation.MyBatisRepository; import com.zixue.entity.Emp;/*** 员工表的DAO组件* */ MyBatisRepository public interface EmpDao {void save(Emp emp);Emp findById(int id);Emp findById2(int id)…

gopro dataset_如何将GoPro安装到DSLR相机

gopro datasetIf you have a DSLR camera with a hot shoe, it’s easy to attach various flashes and other accessories right to your camera. But with a couple of cheap attachments on hand, you can mount your GoPro to your DSLR camera as well. 如果您的DSLR相机带…

jQuery已经过时了,还需要学吗?

说起jQuery,很多刚参加工作的程序员都没用过,甚至没听过。曾几何时jQuery可是秒杀一切Js库,大有一统江山的情况,可是在顶峰的时候,瞬间被Vue、React、Angela三大框架斩于马下。从百度指数,我们也看出在2015…

Bootstrap01

Bootstrap01内容概要 一.使用Bootstrap的步骤 1.下载Bootstrap类库,包含三个部分,fonts,css,Bootstrap 2.导入项目中,在头部引入JQ,css和Bootstrap 注意:JQ要引入在Bootstrap前面! 3.使用css样式时,全部使用class属性 二.全局CSS概要 1.仅支持H5文档格式 2.移动设备优先,需要在…