你不知道的JavaScript之理解作用域(2)

2021-08-21 04:29:11 字數 655 閱讀 3682

中介紹了什麼是lhs和rhs,你可能會疑惑知道他兩有什麼用呢?

結合對lhs和rhs的理解,考慮如下**:

function(a)

foo(2);

在執行log(a+b)時,引擎會對a和b分別做一次rhs查詢,作用域找得到a但是找不到b,因為編譯器沒有進行b的宣告,所以說引擎也獲取不到b的值,於是引擎就會丟擲異常:referenceerror。

下面來看lhs查詢:當引擎做lhs查詢時,如果在全域性作用域中也無法找到變數,全域性作用域就會建立乙個具有該名稱的變數,並交給引擎,但前提是程式執行在寬鬆模式下。也就是說這個變數之前並不存在,但是作用域熱心的為引擎建立了乙個,所以說lhs查詢其實是失敗的,只不過全域性作用域幫著解決了。

但是在嚴格模式下是禁止自動或隱式的建立全域性變數的,因此嚴格模式下lhs查詢失敗時,全域性作用域也沒轍,引擎只能丟擲異常

function f()

f()   //referenceerror:a is not defined

接下來看另外一種情況:如果rhs查詢到了乙個變數,但是你對這個變數進行了不合理的操作,比如對乙個非函式型別進行函式呼叫,那麼就會丟擲另外乙個異常typeerror

總結:作用域判別失敗導致referenceerror,作用於判別成功但是操作非法會導致typeerror

你不知道的javascript(二)

1.詞法作用域 就是定義在詞法階段的作用域,作用域查詢會在找到第乙個匹配的識別符號時停止。在多層的巢狀作用域中可以定義同名的標識 符,這叫作 遮蔽效應 內部的識別符號 遮蔽 了外部的識別符號 拋開遮蔽效應,作用域查詢始終從 執行時所處的最內部作用域開始,逐級向外或者說向上進行,直到遇見第乙個匹配的識...

你不知道的JavaScript (上)

一 編譯的原理主要分為三個步驟 1 分詞 詞法分析 這個步驟主要是將字串分解成有意義的 2 解析 語法分析 陣列巢狀形成結構樹。3 生成 將結構樹轉化為 的過程。二 作用域 引擎主要進行搜尋查詢編譯等過程,分為左查詢lhs和右查詢rhs 編譯器主要是進行 的生成,語法分析。作用域主要是 確定訪問許可...

你不知道的JavaScript 筆記

作用域是什麼?作用域的兩種工作模式 詞法作用域和動態作用域 1.查詢 作用域查詢會在找到第乙個匹配識別符號停止 2.欺騙詞法 eval 修改作用域 with 建立新的作用域 後果 導致js引擎在靜態分析時停止優化,導致效能下降 遵循最小授權原則 1.隱藏內部實現 2.規避衝突 3.立即執行函式 ii...