JavaScript 詞法環境
本文主要講解JS詞法環境,我們將看到什麼是詞法環境,詞法範圍如何工作,函式內部的名稱如何解析,內部屬性,弄清楚詞法環境利於我們理解閉包。讓我們開始吧...
什麼是詞法環境?
在理解閉包時,最大的混淆來源是術語“詞彙環境”,或者只是“詞彙”這個詞。在電腦科學中術語“詞彙”僅表示“原始碼”,或者換句話說,“與寫的程式碼有關”。
大家請考慮以下程式碼:
var a = 'static';
function f1() {
console.log(a);
}
function f2() {
var a = 'dynamic';
f1();
}
f2();
仔細考慮,大家覺得會輸出什麼?正確答案是:static。
首先 JavaScript 編譯器讀取程式的原始碼,並在編譯時根據給定函式的定義確定其可訪問的環境。所以在 f1 被定義的時候它的詞法範圍就已經確定了,即它是全域性定義的所以它的詞法範圍也為全域性。無論在哪裡呼叫,a 都是‘static’。
下一個例子:
var a = 'easy';
(function() {
var b = 'easy';
function f1() {
console.log(a, b);
}
function f2() {
var a = 'difficult';
var b = 'difficult';
f1();
}
f2();
})();
這段程式碼大家覺得結果會是什麼?正確答案:easy easy
說明:f1 的本地環境並沒有定義 a,b 因此搜尋將移至詞彙環境。在詞彙環境中,搜尋的第一個封閉環境,即 IIFE(立即執行函式) 的區域性環境,存在 b;繼續訪問外部範圍獲取到全域性的 a,故 f1 的輸出結果為 easy easy。
最後:請始終記住函式定義的時候詞法範圍就決定了。與其在哪裡呼叫無關。將在下一篇文章講解JS中的閉包。