詞法作用域和動態作用域

2021-10-14 07:46:08 字數 707 閱讀 4175

作用域是指程式源**中定義變數的區域。

它規定了如何查詢變數,也是就確定當前執行**對變數的訪問許可權。

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執行的位置。最小授權原則最小授權原則...