域表示的就是 範圍, 即 作用範圍. 就是乙個名字在什麼地方可以被使用, 什麼時候不能使用.
所謂的 詞法( ** )作用域, 就是**在編寫過程中體現出來的作用範圍. **一旦寫好, 不用執行,
作用範圍就已經確定好了. 這個就是所謂詞法作用域.
這意味著函式執行在定義它的作用域中,而不是在呼叫它的作用域中。
在 js 中詞法作用域規則:
函式允許訪問函式外的資料.
整個**結構中只有函式可以限定作用域.
作用規則首先使用提公升規則分析
如果當前作用規則中有名字了, 就不考慮外面的名字
可以發現只有函式可以製造作用域結構. 那麼只要是**, 至少有乙個作用域, 即全域性作用域.
凡是**中有函式, 那麼這個函式就構成另乙個作用域. 如果函式中還有函式, 那麼再這個作用域中就
又可以誕生乙個作用域. 那麼將這樣的所有的作用域列出來, 可以有乙個結構: 函式內指向函式外的鏈式結構.
繪製作用域鏈的步驟:
看整個全域性是一條鏈, 即頂級鏈, 記為 0 級鏈
看全域性作用域中, 有什麼成員宣告, 就以方格的形式繪製到 0 級練上
再找函式, 只有函式可以限制作用域, 因此從函式中引入新鏈, 標記為 1 級鏈
然後在每乙個 1 級鏈中再次往復剛才的行為
變數的訪問規則
首先看變數在第幾條鏈上, 在該鏈上看是否有變數的定義與賦值, 如果有直接使用
如果沒有到上一級鏈上找( n - 1 級鏈 ), 如果有直接用, 停止繼續查詢.
如果還沒有再次往上剛找... 直到全域性鏈( 0 級 ), 還沒有就是 is not defined
注意, 切記 同級的鏈不可混合查詢
如何分析**
在分析**的時候切記從**的執行進度上來分析, 如果**給變數賦值了, 一定要標記到圖中
如果**比較複雜, 可以在圖中描述**的內容, 有事甚至需要將原型圖與作用域圖合併分析
注意
在乙個函式中的任何位置定義的變數在該函式中的任何地方都可見。
一般都是將變數的宣告全部放到函式開始的位置, 避免出現因為提公升而造成的錯誤
詞法作用域和動態作用域
作用域是指程式源 中定義變數的區域。它規定了如何查詢變數,也是就確定當前執行 對變數的訪問許可權。js 採用了詞法作用域 lexical scoping 也就是靜態作用域。js 採用的詞法作用域是靜態作用域,因此函式的作用域在函式定義的時候就決定了。與靜態作用域相對的是動態作用域,函式的作用域是在函...
詞法作用域 vs 動態作用域
scheme是一門採用詞法作用域 lexical scoping 的lisp方言,這個設計是從alogol語言裡借鑑過來的。現在,詞法作用域已經被許多lisp方言所吸收,實踐表明,這的確是一項正確的設計,避免了很多奇怪的錯誤,比較符合人類的思維習慣。但是,在某些場合下,動態作用域又是很有用的特性,比...
javascript 詞法作用域
定義在詞法階段的作用域,開始時,編譯器做語法分析的時候,確認js裡各個詞法所在的作用域。js裡只有全域性作用域和函式作用域,這裡簡單介紹下js的作用域。看下面 var a 1 var b 0 function foo foo console.log a 11 在foo函式裡,在console.log...