一些名詞
JS引擎 — 一個讀取代碼并運行的引擎,沒有單一的“JS引擎”;,每個瀏覽器都有自己的引擎,如谷歌有V。
作用域 — 可以從中訪問變量的“區域”。
詞法作用域— 在詞法階段的作用域,換句話說,詞法作用域是由你在寫代碼時將變量和塊作用域寫在哪里來決定的,因此當詞法分析器處理代碼時會保持作用域不變。
塊作用域 — 由花括號{}創建的范圍
作用域鏈 — 函數可以上升到它的外部環境(詞法上)來搜索一個變量,它可以一直向上查找,直到它到達全局作用域。
同步 — 一次執行一件事, “同步”引擎一次只執行一行,JavaScript是同步的。
異步 — 同時做多個事,JS通過瀏覽器API模擬異步行為
事件循環(Event Loop) - 瀏覽器API完成函數調用的過程,將回調函數推送到回調隊列(callback queue),然后當堆棧為空時,它將回調函數推送到調用堆棧。
堆棧 —一種數據結構,只能將元素推入并彈出頂部元素。 想想堆疊一個字形的塔樓; 你不能刪除中間塊,后進先出。
堆 — 變量存儲在內存中。
調用堆棧 — 函數調用的隊列,它實現了堆棧數據類型,這意味著一次可以運行一個函數。 調用函數將其推入堆棧并從函數返回將其彈出堆棧。
執行上下文 — 當函數放入到調用堆棧時由JS創建的環境。
閉包 — 當在另一個函數內創建一個函數時,它“記住”它在以后調用時創建的環境。
垃圾收集 — 當內存中的變量被自動刪除時,因為它不再使用,引擎要處理掉它。
變量的提升— 當變量內存沒有賦值時會被提升到全局的頂部并設置為undefined。
this —由JavaScript為每個新的執行上下文自動創建的變量/關鍵字。
調用堆棧(Call Stack)
看看下面的代碼:
var myOtherVar = 10function a() {console.log('myVar', myVar)b()}function b() {console.log('myOtherVar', myOtherVar)c()}function c() {console.log('Hello world!')}a()var myVar = 5有幾個點需要注意:
變量聲明的位置(一個在上,一個在下) 函數a調用下面定義的函數b, 函數b調用函數c當它被執行時你期望發生什么? 是否發生錯誤,因為b在a之后聲明或者一切正常? console.log 打印的變量又是怎么樣?
以下是打印結果:
"myVar" undefined"myOtherVar" 10"Hello world!"
來分解一下上述的執行步驟。
1. 變量和函數聲明(創建階段)
第一步是在內存中為所有變量和函數分配空間。 但請注意,除了undefined之外,尚未為變量分配值。 因此,myVar在被打印時的值是undefined,因為JS引擎從頂部開始逐行執行代碼。
新聞熱點
疑難解答
圖片精選