你不知道的javascript上卷小結
第一章 作用域是什麼
- 編譯
- 作用域
- 作用域巢狀
javascript通常被歸類為“動態”或者解釋性語言,但事實上他是一門編譯語言,與傳統的編譯語言不同的是,它不是提前編譯的,編譯結果也不能在分散式系統中進行移植。儘管如此javascript引擎進行編譯和傳統的編譯語言非常相似,在某些環節可能是比預想的要複雜的,在傳統編譯語言的流程中,程式中的一段原始碼在執行之前會經歷三個步驟,統稱為**"編譯"**
-
分詞/詞法分析
這個過程會將有字串組成的字元分解成(對程式語言來說)有意義的程式碼塊,這些程式碼塊統稱為詞法單元。比如
var a = 2; //這段程式碼會被分解成為下面的這些詞法單元 var,a ,= , 2 ,; //空格是否會被當做詞法單元,取決於空格在這門語言中是否具有意義 複製程式碼
-
解析/語法分析
這個過程大概就是將詞法單元流轉化成一個有元素逐級巢狀所組成的代表了程式語法的結構樹 稱為抽象語法書
-
程式碼生成
大概就在這個階段進行變數的記憶體分配
-
個人小結:
編譯型語言:把做好的源程式全部編譯成二進位制程式碼的可執行程式。然後,可直接執行這個程式。 解釋型語言:把做好的源程式翻譯一句,然後執行一句,直至結束!
在看這本書之前一直稱javascript是一門解釋性語言,通常大家都叫它是指令碼語言。剛好最近在學習java 可以讓你更加對編譯這個階段比較清楚一點 直接上圖啦
這個.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(); //這段程式碼能夠讓我們更加清晰的覺得詞法作用域就是我們開發者在一開始書寫程式碼的時候就已經確定了 //那個變數在哪裡能夠訪問到 在哪裡不能訪問到 複製程式碼