javascript一般被歸類爲「動態」或者解釋性語言,但事實上他是一門編譯語言,與傳統的編譯語言不一樣的是,它不是提早編譯的,編譯結果也不能在分佈式系統中進行移植。儘管如此javascript引擎進行編譯和傳統的編譯語言很是類似,在某些環節多是比預想的要複雜的,在傳統編譯語言的流程中,程序中的一段源代碼在執行以前會經歷三個步驟,統稱爲**"編譯"**javascript
分詞/詞法分析java
這個過程會將有字符串組成的字符分解成(對編程語言來講)有意義的代碼塊,這些代碼塊統稱爲詞法單元。好比編程
var a = 2;
//這段代碼會被分解成爲下面的這些詞法單元
var,a ,= , 2 ,;
//空格是否會被當作詞法單元,取決於空格在這門語言中是否具備意義
複製代碼
解析/語法分析編程語言
這個過程大概就是將詞法單元流轉化成一個有元素逐級嵌套所組成的表明了程序語法的結構樹 稱爲抽象語法書分佈式
代碼生成學習
大概就在這個階段進行變量的內存分配ui
我的小結:spa
編譯型語言:把作好的源程序所有編譯成二進制代碼的可運行程序。而後,可直接運行這個程序。 解釋型語言:把作好的源程序翻譯一句,而後執行一句,直至結束!翻譯
在看這本書以前一直稱javascript是一門解釋性語言,一般你們都叫它是腳本語言。恰好最近在學習java 可讓你更加對編譯這個階段比較清楚一點 直接上圖啦3d
這個.java文件裏面的東西很簡單就是輸出一個"Hello world"
下面咱們將它編譯成java虛擬機能夠執行的class文件咱們用java編譯器將java 編譯成class 文件 將這個文件再交給java虛擬機讓虛擬機執行裏面的代碼,這個過程是否是更加清楚編譯這個過程 大概就是在代碼執行前,編譯器對咱們寫的代碼進行了檢查和搭建運行代碼的環境吧。在javaacript裏面重要的一個概念就是做用域,做用域鏈。下面咱們進入做用域你的學習。
咱們將「做用域」定義爲一套規則,這套規則用來管理引擎如何在當前做用域以及嵌套的做用域裏面根據標識符名稱進行變量查找。
詞法階段
理解詞法做用域纔可以更好地寫清楚本身定義的變量在哪裏可以訪問到,在哪裏不能訪問到,換句話說就是詞法做用域徹底就是由你在寫代碼時將變量和做用域塊寫在哪裏來決定的,所以當詞法分析器處理代碼時會保持做用域不變(大部分狀況是這樣 eval with會欺騙詞法)可是通常狀況下用不到
好啦思考以下代碼 你以爲代碼運行後的結果是什麼?
const a = 100;
function x(){
console.log(a);
}
function y(){
const a = 0;
x();
}
y();
//這段代碼可以讓咱們更加清晰的以爲詞法做用域就是咱們開發者在一開始書寫代碼的時候就已經肯定了
//那個變量在哪裏可以訪問到 在哪裏不能訪問到
複製代碼