作用域是指程式源**中定義變數的區域。
它規定了如何查詢變數,也是就確定當前執行**對變數的訪問許可權。
js 採用了詞法作用域(lexical scoping),也就是靜態作用域。
js 採用的詞法作用域是靜態作用域,因此函式的作用域在函式定義的時候就決定了。
與靜態作用域相對的是動態作用域,函式的作用域是在函式呼叫的時候才決定的。
例如:
var value =1;
function
foo(
)function
bar(
)bar()
;// ???
因為 js 是靜態作用域,因此執行過程大致如下:
執行foo
函式,先從foo
函式內部查詢是否有區域性變數value
,若沒有,就根據書寫位置,查詢上面一層的**,也就是value
等於1
,因此上面的**會列印1
。
若是動態作用域,當foo
內部找不到value
時,會從呼叫函式的作用域,也就是bar
內部查詢value
,此時就會列印2
。
詞法作用域 vs 動態作用域
scheme是一門採用詞法作用域 lexical scoping 的lisp方言,這個設計是從alogol語言裡借鑑過來的。現在,詞法作用域已經被許多lisp方言所吸收,實踐表明,這的確是一項正確的設計,避免了很多奇怪的錯誤,比較符合人類的思維習慣。但是,在某些場合下,動態作用域又是很有用的特性,比...
詞法作用域
域表示的就是 範圍,即 作用範圍.就是乙個名字在什麼地方可以被使用,什麼時候不能使用.所謂的 詞法 作用域,就是 在編寫過程中體現出來的作用範圍.一旦寫好,不用執行,作用範圍就已經確定好了.這個就是所謂詞法作用域.這意味著函式執行在定義它的作用域中,而不是在呼叫它的作用域中。在 js 中詞法作用域規...
詞法作用域 VS 動態作用域 VS 立即執行函式
js詞法作用域是由你在寫 時將變數和塊作用域寫在 來決定。js動態作用域和this機制息息相關。它的作用域詩是在執行的過程中確定 var a 1 function foo foo 1從上面的 我們可以看出 foo中列印a的值不是由寫 的位置確定的,而是取決於foo執行的位置。最小授權原則最小授權原則...