作用域 - note1(《你不知道的JavaScript》筆記,這個書寫的很有趣,可以看看)
程式var a = 2 處理時發生了啥
了解將要參與到對程式 var a = 2; 進行處理的程序中的演員們,
- 引擎
- 從頭到尾負責整個 JavaScript 程式的編譯及執行程序,
- 編譯器
- 引擎的好朋友之一,負責語法分析及代碼生成等臟活累活,
- 作用域
- 引擎的另一位好朋友,
負責收集并維護由所有宣告的識別符號(變數)組成的一系列查詢,并實施一套非常嚴格的規則,確定當前執行的代碼對這些識別符號的訪問權限,
- 引擎的另一位好朋友,
在處理程式var a = 2這些演員具體干了啥
- 遇到 var a,編譯器會詢問作用域是否已經有一個該名稱的變數存在于同一個作用域的 集合中,如果是,編譯器會忽略該宣告,繼續進行編譯;否則它會要求作用域在當前作 用域的集合中宣告一個新的變數,并命名為 a,
- 接下來編譯器會為引擎生成運行時所需的代碼,這些代碼被用來處理 a = 2 這個賦值 操作,引擎運行時會首先詢問作用域,在當前的作用域集合中是否存在一個叫作 a 的 變數,如果是,引擎就會使用這個變數;如果否,引擎會繼續查找該變數,如果引擎最終找到了 a 變數,就會將 2 賦值給它,否則引擎就會舉手示意并拋出一個例外,
了解引擎是如何進行查找的
了解LHS和RHS(你可以理解成 retrieve his source value(取到它的源值),這意味著“得到某某的 值”)
- 例子var a = 2,執行了LHS查詢,賦值操作通過LHS進行查詢,
- console.log(a), 變數a未進行賦值,則會通過RHS進行查詢a的值,
引擎如何在作用域的幫助下正確的查找
function foo(a) { console.log( a ); // 2
}
foo( 2 );
- 讓我們把上面這段代碼的處理程序想象成一段對話,這段對話可能是下面這樣的,
- 引擎:我說作用域,我需要為 foo 進行 RHS 參考,你見過它嗎? 作用域:別說,我還真見過,編譯器那小子剛剛宣告了它,它是一個函式,給你,
- 引擎:哥們太夠意思了!好吧,我來執行一下 foo, 引擎:作用域,還有個事兒,我需要為 a 進行 LHS 參考,這個你見過嗎? 作用域:這個也見過,編譯器最近把它聲名為 foo 的一個形式引數了,拿去吧,
- 引擎:大恩不言謝,你總是這么棒,現在我要把 2 賦值給 a, 引擎:哥們,不好意思又來打擾你,我要為 console 進行 RHS 參考,你見過它嗎? 作用域:咱倆誰跟誰啊,再說我就是干這個,這個我也有,console 是個內置物件, 給你,
- 引擎:么么噠,我得看看這里面是不是有 log(..),太好了,找到了,是一個函式, 引擎:哥們,能幫我再找一下對 a 的 RHS 參考嗎?雖然我記得它,但想再確認一次, 作用域:放心吧,這個變數沒有變動過,拿走,不謝,
- 引擎:真棒,我來把 a 的值,也就是 2,傳遞進 log(..),
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/225492.html
標籤:其他
