定義在詞法階段的作用域,開始時,編譯器做語法分析的時候,確認js裡各個詞法所在的作用域。js裡只有全域性作用域和函式作用域,這裡簡單介紹下js的作用域。
看下面**:
var a = 1;
var b = 0;
function foo()
foo();
console.log(a); //1
1、在foo函式裡,在console.log(a),對a進行rhs查詢,發現在當前作用域存在變數a,如果foo裡沒有a就往上一層(全域性)去查詢
2、在foo函式裡,在console.log(b),對b進行rhs查詢,發現在當前作用域不存在變數b,然後往上一層(全域性)去查詢b,發現存在變數b,獲取b的值。
在詞法分析階段,會確認在全域性作用域裡有a,b這兩個變數,函式foo作用域裡有a這個變數
但是,有些方法可以欺騙或者動態生成作用域。
例如:eval、settimeout、with等
eval函式可以理解為在當前作用域插入一段**。
如下:
var b = 2;
function foo()
foo();
console.log(b); //2
在開始的詞法分析中,foo函式作用域並不存在變數b,然而在引擎執行**的時候,到eval函式執行,就強行在foo函式作用域中插入變數b
settimeout
定時器函式是乙個非同步函式,第乙個引數中字串的執行作用域是全域性作用域,類似上面動態插入變數。
var b = 1;
function foo()
foo();
console.log(b); //1
with
擴充套件乙個語句的作用域鏈。
在乙個對像是擴充套件屬性,如果屬性存在就修改屬性值,如果不存在就掛載在全域性物件上,類似於在函式裡不用var宣告的變數都掛在window物件上。
詞法作用域
域表示的就是 範圍,即 作用範圍.就是乙個名字在什麼地方可以被使用,什麼時候不能使用.所謂的 詞法 作用域,就是 在編寫過程中體現出來的作用範圍.一旦寫好,不用執行,作用範圍就已經確定好了.這個就是所謂詞法作用域.這意味著函式執行在定義它的作用域中,而不是在呼叫它的作用域中。在 js 中詞法作用域規...
詞法作用域和動態作用域
作用域是指程式源 中定義變數的區域。它規定了如何查詢變數,也是就確定當前執行 對變數的訪問許可權。js 採用了詞法作用域 lexical scoping 也就是靜態作用域。js 採用的詞法作用域是靜態作用域,因此函式的作用域在函式定義的時候就決定了。與靜態作用域相對的是動態作用域,函式的作用域是在函...
詞法作用域 vs 動態作用域
scheme是一門採用詞法作用域 lexical scoping 的lisp方言,這個設計是從alogol語言裡借鑑過來的。現在,詞法作用域已經被許多lisp方言所吸收,實踐表明,這的確是一項正確的設計,避免了很多奇怪的錯誤,比較符合人類的思維習慣。但是,在某些場合下,動態作用域又是很有用的特性,比...