詞法作用域

2021-08-02 07:34:06 字數 1131 閱讀 8853

域表示的就是 範圍, 即 作用範圍. 就是乙個名字在什麼地方可以被使用, 什麼時候不能使用.

所謂的 詞法( ** )作用域, 就是**在編寫過程中體現出來的作用範圍. **一旦寫好, 不用執行,

作用範圍就已經確定好了. 這個就是所謂詞法作用域.

這意味著函式執行在定義它的作用域中,而不是在呼叫它的作用域中。

在 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...