你不知道JavaScript學習二——詞法做用域

做用域有兩種工做模型:
第一種是最爲廣泛的,被大多數編程語言所採用的詞法做用域
第二種叫做動態做用域
詞法做用域就是定義在詞法階段的做用域。換句話說,詞法做用域是由你在寫代碼時將變量和塊做用域寫在哪裏來決定的,所以當詞法分析器處理代碼時會保持做用域不變。
做用域氣泡由其對應的做用域塊代碼寫在哪裏決定,它們是逐級包含的。
查找
做用域查找首先從最內部的做用域,逐級向外或者說向上進行,直到碰見第一個匹配的標識符爲止。
做用域查找會在找到第一個匹配的標識符時中止。
function foo(a) {
var b = a * 2;
function bar(c) {
console.log( a, b, c );
}
bar( b * 3 );
}
foo( 2 ); // 2, 4, 12

 

 

(1)包含着整個全局做用域,其中只有一個標識符: foo 。
(2)包含着 foo 所建立的做用域,其中有三個標識符: a 、 bar 和 b 。
(3)包含着 bar 所建立的做用域,其中只有一個標識符: c 。javascript

欺騙詞法
(1)eval
在執行 eval(..) 以後的代碼時,引擎並不「知道」或「在乎」前面的代碼是以動態形式插入進來,並對詞法做用域的環境進行修改的。引擎只會如往常地進行詞法做用域查找。
(2)with
with 能夠將一個沒有或有多個屬性的對象處理爲一個徹底隔離的詞法做用域,所以這個對象的屬性也會被處理爲定義在這個做用域中的詞法標識符。
另一個不推薦使用 eval(..) 和 with 的緣由是會被嚴格模式所影響(限制)。 with 被徹底禁止,而在保留核心功能的前提下,間接或非安全地使用eval(..) 也被禁止了。
相關文章
相關標籤/搜索