理解作用域
對於語句 var a = 2;
編譯過程分兩步:一是完成變數的宣告,如果同一作用域下已經有了該宣告,編譯器會忽略;二是為js引擎的執行生成**;
編譯之後生成了可執行的**,接下來由引擎來執行;此時引擎會做兩件事情,一是lsh查詢,二是rsh查詢;
"l"和"r"分別指左和右,但是本質上lsh指的是對變數宣告的查詢或者說為2找了乙個容器,而rsh指的是對變數的值的查詢;
對於以下語句:
function foo(){
console.log(a);
想象引擎和作用域之間的對話,也許是這樣的:
引擎:作用域啊,我需要為foo進行rhs查詢(因為我要執行foo),你見過它嗎?
作用域:見過!編譯器那傢伙剛剛生命了它。是乙個函式,給你!
引擎:好的,我來執行一下它。
引擎:還有個事,我需要對a進行lhs查詢(因為我要把2給它),你見過嗎?
作用域:這個也見過,編譯器把他生明為foo的乙個引數了
引擎:ok,那現在我就把2給它。
引擎:我要為console進行rhs查詢(因為我要執行console),你見過嗎?
作用域:當然!console是乙個內建物件,給你!
引擎:多謝,我來找找這有沒有log()......找到了,是乙個函式,我來執行一下。
引擎:我還需要對a做乙個rhs查詢(因為要執行log(a)),我當初把2給了它,它現在有什麼變化嗎?
作用域:放心吧,它沒有動過,給你!
引擎:那我就把a的值傳進來啦!
然後這有乙個測試題,關於對lsh和rsh的理解:
function foo(a){
var b = a;
return a+b;
var c = foo(2);
我的理解是這樣的:執行foo(2)會又一次rsh查詢,然後傳參時對a要進行一次lsh查詢,執行 b = a時要對a進行一次rsh查詢,然後對b進行一次lsh查詢,執行return a+b時要對a和b分別進行一次rsh查詢,最後將返回值賦值給c,這要進行一次lsh查詢,所以這段**一共有三次lsh查詢和四次rsh查詢 。
你不知道的javascript(二)
1.詞法作用域 就是定義在詞法階段的作用域,作用域查詢會在找到第乙個匹配的識別符號時停止。在多層的巢狀作用域中可以定義同名的標識 符,這叫作 遮蔽效應 內部的識別符號 遮蔽 了外部的識別符號 拋開遮蔽效應,作用域查詢始終從 執行時所處的最內部作用域開始,逐級向外或者說向上進行,直到遇見第乙個匹配的識...
你不知道的JavaScript (上)
一 編譯的原理主要分為三個步驟 1 分詞 詞法分析 這個步驟主要是將字串分解成有意義的 2 解析 語法分析 陣列巢狀形成結構樹。3 生成 將結構樹轉化為 的過程。二 作用域 引擎主要進行搜尋查詢編譯等過程,分為左查詢lhs和右查詢rhs 編譯器主要是進行 的生成,語法分析。作用域主要是 確定訪問許可...
你不知道的JavaScript 筆記
作用域是什麼?作用域的兩種工作模式 詞法作用域和動態作用域 1.查詢 作用域查詢會在找到第乙個匹配識別符號停止 2.欺騙詞法 eval 修改作用域 with 建立新的作用域 後果 導致js引擎在靜態分析時停止優化,導致效能下降 遵循最小授權原則 1.隱藏內部實現 2.規避衝突 3.立即執行函式 ii...