- 第一部分 作用域和閉包
- 第1章 作用域是什么
- 1.1編譯原理
- 1.2理解作用域
- 1.3作用域嵌套
- 1.5例外
- 第2章 詞法作用域
- 第3章 函式作用域和塊作用域
- 第5章 作用域和閉包
- 第1章 作用域是什么
- 第二部分 this和物件原型
- 第1章 關于this
- 第2章 this全面決議
- 第3章 物件
- 第4章 混合物件“類”
- 第5章 原型
- 第6章 行為委托
之前被好友推薦過《你不知道的JavaScript》這一系列的書籍,上中下三本書都不算厚,內容也是比較獨立,本來是打算一個月內看完這本上卷和下卷,可總是因為自己的懶惰讀了一個月才斷斷續續讀完上卷,不得不說單是粗略的讀完上卷就讓我很有識訓,下面是對上卷部分的讀書筆記,不是什么檔案和教程,僅僅供自己學習記錄,歡迎各位路過的大佬能指出理解錯誤的地方以及意見,
第一部分 作用域和閉包
第1章 作用域是什么
1.1編譯原理
首先,我也是學習JavaScript一開始,找到資料里面就說JavaScript是一門“解釋型”語言,但是其實JavaScript是一門編譯語言,
在傳統的編譯語言中,一段源代碼執行前會先經過一段叫做編譯的操作,而編譯一共有如下3個程序,
- 分詞/詞法分析(Tokenizing/Lexing)
這個程序將把編程語言的字串分解為有意義的代碼塊,這些代碼塊被稱為詞法單元(token)
var a = 2;
//就會被拆解成 var、a、=、2、; 這些都是詞法單元
//而空格是否屬于此法單元取決于是否有意義,
//這里的var a = 2;中的任何一個空格都沒有意義
- 決議/語法分析(Parsing)
把眾多詞法單元組成的詞法單元流(陣列)轉換成一顆樹的結構,叫抽象語法樹(AbstractSyntaxTree,AST)
var a = 2;
//這句陳述句轉化為樹的結構是一個叫做VariableDeclaration
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4rnlCF0N-1604651680070)(./上img/抽象語法樹.png)]](https://img.uj5u.com/2020/11/07/176397071240531.png)
- 代碼生成
將語法樹轉化為可執行的代碼程序,
其他的語言的編譯在構建前,而JavaScript在執行前也會進行這編譯3部曲
1.2理解作用域
對var a = 2;處理時候,具體的編譯器是這樣作業的,
//1 遇到 var a 編譯器會在當前作用域中的一個集合查詢是否有a這個變數,
//如果有就繼續進行第2步編譯動作,
//如果沒有會要求當前作用域在自己的這個集合中宣告一個新的a變數
//2 遇到 a = 2 編譯器為這條陳述句生成運行時候的代碼,供運行時候使用,
//這時候編譯器要在生成的代碼中表達出 a=2這個意思,所以在生成代碼時候,
//需要一個a變數,先去找當前的作用域中的集合是否含有這個變數,
//如果沒有就去上一層找,直到找到為止,否者就是報錯,
在這里注意的是在步驟2中,編譯器會查找作用域集合中時候會有2種不同的查找方式,一種是LHS,一種是RHS,也就是左查詢與右查詢,這個和我在學習C++中左值右值時候,我覺得十分相識,也就是通過最原始的“=”進行理解,左邊是被填充的,右邊是去填充的,

var a = 2;//這里編譯器生成代碼時候,會去當前作用域集合中找a變數,然后賦值為2,
//你可以理解為是找到這片叫做a空間,然后填充上2這個資料,
//所以這里是左查詢,也就是找到被填充的a空間
console.log(a)//這里編譯器生成代碼時候,會去當前作用域集合中找a變數,然后列印出來,
//你可以理解為是找到這個叫做a的變數里面的值,然后使用這個值,
//所以這里是右查詢,也就是找到去填充(或者理解為取出來使用)的a空間里面本身的值!!!
1.3作用域嵌套
其實書中這部分的內容講的就是作用域鏈,也就是對var a = 2;處理時候,具體的編譯器作業的第二步中需要一個a變數,先去找當前的作用域中的集合是否含有這個變數,如果沒有就去上一層找,直到找到為止,直到最頂層沒有報錯為止,這就是一直往上的查找就是順著作用域鏈,
var b = 3
function foo(a){
console.log(a+b)
}
foo(2)//4
//這里的function內部是自己的函式作用域,function外面是全域作用域,
//function內部作用域沒有b變數,為什么還能具體作業?
//就是因為function中沒有,所以找上一級,然后上一級中就有b,就可以使用
//這種機制就是作用域嵌套,或者作用域鏈,
//我反正是理解為,子作用域可以使用父作用域,但是父作用域不可以反過來使用子作用域,
//當然這里的什么父、子作用域是個人為了理解,自己說的,不是什么術語,
1.5例外
前面都是順著作用域鏈能查找成功的時候,但是我們也說過,如果找不到會報錯,這里我們查找有2中情況,自然左右查找不到,報錯是不一樣的,

這里小小驗證一下書上講的左查詢吧,
a = 2//這里沒有var 宣告,但是a=2是左查找,所以左查詢熱心的會在全域作用域中的集合里面創建一個空的a變數空間,
console.log(a)//右查找結果是2
"use strict"
a = 2//不好意思,這次左查詢無法幫助生成一個空的a變數空間了,
//單單是這一句陳述句就會因為左查詢失敗,報ReferenceError
console.log(a)//右查找,肯定失敗,這句本生也是右查找失敗報ReferenceError,
//不過前一句本來就是錯,壓根也不會運行到這一句,
第2章 詞法作用域
第3章 函式作用域和塊作用域
第5章 作用域和閉包
第二部分 this和物件原型
第1章 關于this
第2章 this全面決議
第3章 物件
第4章 混合物件“類”
第5章 原型
第6章 行為委托
未完待續,周六整理完第一部分
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/205478.html
標籤:其他
