《你不知道的JS(上捲 )》 二 詞法作用域

2022-05-17 09:43:44 字數 913 閱讀 4973

​ 作用域共有兩種主要的工作模型。普遍被採用的的是第一種,詞法作用域。另一種為動態作用域,被bash指令碼、perl中的一些模式所採用。

​ 第一章提到過編譯階段之一——詞法分析。詞法作用域就是定義在詞法階段的作用域,即詞法作用域由你在寫**時將變數和塊作用域寫在**來決定的,大部分情況下詞法分析器處理**時會保持作用域不變。

作用域查詢會在找到第乙個匹配的識別符號時停止。在多層的巢狀作用域中可以定義同名的識別符號,內部的識別符號」遮蔽「了外部的識別符號,這就是遮蔽效應。

​ 通常不應該使用這些詞法,會造成安全問題以及效能變慢。

eval:接受乙個字串為引數,並將其中的內容視為好像在書寫時就存在與程式中這個位置的**。

function foo(str, a) 

var b = 2;

foo("var b = 3;", 1); // 1, 3

with:

​ with可以將乙個沒有或有多個屬性的物件處理為乙個完全隔離的詞法作用域,因此這個物件的屬性也會被處理為定義在這個作用域中的詞法識別符號。

function foo(obj) 

}var o1 =

var o2 =

foo(o1);

console.log(o1.a); // 2

foo(o2);

console.log(o2.a); // undefined

console.log(a); // 2

​ 最後一步之所以會出現乙個全域性變數,是因為進行了一次lhs查詢。而直接在外層作用域中對o2.a進行查詢,當o2沒有a屬性時,並不會建立這個屬性,而是保持undefined。

你不知道的JavaScript 作用域(二)

詞法階段 詞法作用域是定義在詞法階段的作用域。欺騙詞法 欺騙詞法的兩個機制 1 eval function foo str,a var b 2 foo var b 3 1 結果是1,3function foo str foo var a 2 2 with var obj 單調乏味的重複 obj ob...

《你不知道的JS(上捲 )》 一 關於this

function identity var me var you identity.call me kyle identity.call you reader 觀察上面的 使用了this,identity函式就不再需要為每乙個物件編寫不同版本的函式。回想之前學習的詞法作用域,如果我們想要使用詞法作用...

你不知道的JS(作用域和閉包)

第一節 作用域 根據名稱查詢變數的一套規則 referenceerror與作用域判別失敗有關,而typeerror則表示作用域判別成功了,但是對結果的操作是不合法的 var a 2 會被分解成兩個步驟 1.在其作用域生成新變數 若沒有 2.lhs查詢對其賦值 不成功的rhs會丟擲referencee...