《你不知道的JavaScript》-- 精讀(一)

知識點

1.編譯原理

程序中的一段源代碼在執行以前會經歷三個步驟:分詞/詞法分析,解析/語法分析,代碼生成,統稱爲「編譯」。編程

簡單說,就是有某種方法能夠將var a = 2;的AST轉化爲一組機器指令,用來建立一個叫作a的變量(包括分配內存等),並將一個值儲存在a中。瀏覽器

2.理解做用域

  • 引擎:從頭至尾負責整個JavaScript程序的編譯及執行過程
  • 編譯器:負責語法分析及代碼生成等
  • 做用域:負責收集並維護由全部聲明的標識符(變量)組成的一系列查詢,並實施一套很是嚴格的規則,肯定當前執行的代碼對這些標識符的訪問權限。

總結:變量的賦值操做會執行兩個動做,首先編譯器會在當前做用域中聲明一個變量(若是以前沒有聲明過),而後在運行時引擎會在做用域中查找該變量,若是可以找到就會對它賦值。bash

3.LHS和RHS

引擎在做用域協助下的查詢變量操做編程語言

查找並取值是RHSide

console.log(a)
複製代碼

查找並賦值是LHSui

a = 2;
複製代碼

4.小測驗

function foo(a){  // a = 2
    var b = a;   // b =  , = a
    return a + b;  // a   ,b  
}
var c = foo(2)  // c = ...  , foo(2)
// LHS 3處
// RHS 4處
複製代碼

做用域嵌套

function foo(a){
    console.log(a+b);
}
var b = 2;
foo(2) // 4
複製代碼

引擎從當前的執行做用域開始查找變量,若是找不到,就向上一級繼續查找。當抵達最外層全局做用域時,不管找到仍是沒找到,查找過程都會中止。spa

總結

1.做用域是一套規則,用於肯定在何處以及如何查找變量(標識符)。若是查找的目的是對變量進行賦值,那麼就會使用LHS查詢,若是目的是獲取變量的值,就會使用RHS查詢。code

2.JavaScript引擎首先會在代碼執行前對其進行編譯,在這個過程當中,像var a = 2這樣的聲明會被分解成兩個獨立的步驟:ip

  • var a 在其做用域中聲明新變量
  • a = 2會查詢(LHS查詢)變量a並對其賦值。

3.不成功的RHS引用會致使拋出ReferenceError異常。不成功的LHS引用會致使自動隱式地建立一個全局變量(非嚴格模式下),該變量使用LHS引用的目標做爲標識符,或者拋出ReferenceError異常(嚴格模式下)內存

思考

JavaScript引擎是如何區分var a; a的變量類型的?

擴展

編程語言一般會分爲彙編語言,機器語言,腳本語言,高級語言四類。而高級語言又會分爲解釋類語言和編譯類語言,一般會將JavaScript歸類爲解釋類語言,可是事實上,它是一門編譯類語言,只是與傳統的編譯語言不一樣,它會在程序運行前的幾微秒內進行編譯,而且不會生成字節碼文件。

JavaScript引擎是一個專門處理JavaScript腳本的虛擬機,通常會附帶在網頁瀏覽器之中。 市面上主要的JavaScript引擎有Chrome瀏覽器的V8引擎,Mozilla Firefox的Gecko排版引擎,SpiderMonkey和Rhino,以及Opera等。

巴拉巴拉

晚上睡很差的危害:

1.次日會懵逼,腦子不夠用,

2.次日會暴飲暴食

3.次日會情緒不在線,易怒

4.最恐怖的是日常能夠消化或者沒消化完的情緒會反噬,說話會沒思考,後悔的次數也變多,會更糾結

解決方法:

1.早睡

2.失眠嘗試簡單的催眠方法,減輕睡不着的心理負擔

3.不少時候,不去擔憂次日的事情都不會失眠的,因此在發生晚上睡很差的次日,也沒什麼,相信本身的自我調節能力,時刻保持不失控的狀態。

相關文章
相關標籤/搜索