關于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.pswp.cn/news/280265.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280265.shtml
英文地址,請注明出處:http://en.pswp.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…

spring boot中servlet啟動原理

啟動過程及原理 1 spring boot 應用啟動運行run方法 StopWatch stopWatch new StopWatch();stopWatch.start();ConfigurableApplicationContext context null;FailureAnalyzers analyzers null;configureHeadlessProperty();SpringApplicationRunListeners listeners getRu…

某乎有人問--微軟會拋棄C#嗎,有點擔心?

在某乎有人問:微軟會拋棄C#嗎,有點擔心?,類似這樣的問題,一直都有很多人在問,今天我們就來聊聊這個問題。沒必要擔心微軟倒閉了,C#都不會消失,其實.Net已經不屬于微軟的了。C#是屬于…

mailing list的原理

1 發往mailing list郵箱的郵件會被所有訂閱了該郵箱的人收到 說白了,就是一種郵件群發機制,為了簡化群發,不是將所有的收件人放到收件人列表中,而是發往總的郵箱即可。 2 要向該mailing list郵箱中發送郵件需要先要訂閱 但是&…

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…

Jenkins安裝部署

Jenkins安裝部署 Jenkins簡介 Jenkins是一個開源軟件項目,是基于Java開發的一種持續集成工具,用于監控持續重復的工作,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。 安裝步驟 本文以CentOS7為環境,安裝…

Angular2中的路由(簡單總結)

Angular2中建立路由的4個步驟: 1、路由配置:最好新建一個app.toutes.ts文件(能不能用ng命令新建有待調查) Angular2中路由要解決的是URL與頁面的對應關系(比如URL是http://localhost:4200/all-people,那么頁…

受 SQLite 多年青睞,C 語言到底好在哪兒?

SQLite 近日發表了一篇博文,解釋了為什么多年來 SQLite 一直堅持用 C 語言來實現,以下是正文內容: C 語言是最佳選擇 從2000年5月29日發布至今,SQLite 一直都是用 C 語言實現。C 一直是實現像 SQLite 這類軟件庫的最佳語言。目前&…

為什么 Random.Shared 是線程安全的

在多線程環境中使用 Random 類來生成偽隨機數時,很容易出現線程安全問題。例如,當多個線程同時調用 Next 方法時,可能會出現種子被意外修改的情況,導致生成的偽隨機數不符合預期。為了避免這種情況,.NET 框架引入了 Ra…

(3)Python3筆記之變量與運算符

一、變量 1). 命名規則: 1. 變量名不能使用系統關鍵字或保留關鍵字 2. 變量區分大小寫 3. 變量命名由字母,數字,下劃線組成但不能以數字開頭 4. 不需要聲明變量類型 是 a 1 非 int a 1 5. 查看變量內存地址 id(a), id(b) 6…

some demos

import ../css/detail.css;// 找到字符串中重復次數最多的字符 function findMax(str) {let maxChar ;let maxValue 1;if (!str.length) return;let arr str.replace(/\s/g, ).split();let obj {};for (let i 0; i < arr.length; i) {if (!obj[arr[i]]) {obj[arr[i]] …

WPF 實現視頻會議與會人員動態布局

WPF 實現視頻會議與會人員動態布局控件名&#xff1a;SixGridView作 者&#xff1a;WPFDevelopersOrg - 驚鏵原文鏈接[1]&#xff1a;https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用.NET40&#xff1b;Visual Studio 2019;接著上一篇是基于Grid實現的視頻查看感…

漢三水屬國(北地屬國、安定屬國)

漢三水屬國&#xff08;北地屬國、安定屬國&#xff09; 兩漢&#xff08;西漢、東漢&#xff09;400年中&#xff0c;由于各種原因&#xff0c;經常有成批的匈奴歸附漢朝&#xff0c;兩漢政府對他們采取了較為妥善的安置政策&#xff0c;其中最主要的措施是為他們設立專門的居…

《爆發》作者:大數據領域將有新贏家

本文講的是《爆發》作者&#xff1a;大數據領域將有新贏家,全球復雜網絡研究專家日前到訪中國&#xff0c;為其新作《爆發》作宣傳。他在接受國內媒體采訪時表示&#xff0c;未來可能有新公司取代谷歌、Facebook等公司&#xff0c;成為大數據領域的贏家。 《爆發》一書是一本討…

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有時有限功能…

Stream流與Lambda表達式(四) 自定義收集器

一、自定義SetCustomCollector收集器 package com.java.design.Stream.CustomCollector;import java.util.*; import java.util.function.BiConsumer; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.function.Supplier; im…

ModelState.IsValid忽略型別的檢查錯誤

Web Api在Int或DateTime如果傳空值的話會自動幫忙設預設值&#xff0c;但是在ModelState.IsValid的時候&#xff0c;卻會出現型別上的錯誤.解決方式把Model改成正確&#xff0c;也就是預設允許可以為nullpublic class DemoModel { …

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…

關于前端性能優化

常用的優化有兩部分 第一&#xff1a;面向內容的優化 減少 HTTP 請求減少 DNS 查找避免重定向使用 Ajax 緩存延遲載入組件預先載入組件減少 DOM 元素數量切分組件到多個域最小化 iframe 的數量不要出現http 404 錯誤第二&#xff1a;面向 Server 縮小 Cookie針對 Web 組件使用域…