詞法環境

詞法環境(lexical environment)由兩個部分組成:

  1. 環境記錄——一個儲存所有區域性變數作為其屬性的物件。
  2. 對外部詞法環境的引用,與外部程式碼相關聯。

全域性詞法環境在指令碼執行前建立,它沒有更外層的詞法環境。

// 全域性詞法環境
let a = 'hello' // => hello
let b // => undefined
b = 'world' // => world

ab作為環境記錄這一物件的屬性,它們被宣告時就被賦予值或在之後的過程中被賦予值。

let who = '小明'
function say(content) {
let date = new Date()
alert(`${who}說:${content} | at ${date}`)
}
say('你好,世界!')

say()函式能夠構成一個詞法環境,因為函式引用了外部詞法環境(也就是環境記錄的屬性who)。say()函式訪問外部詞法環境時,首先會搜尋內部詞法環境,然後搜尋外部詞法環境,然後搜尋更外部的詞法環境,以此類推,直到全域性詞法環境。

閉包

一個函式和其詞法環境的組合就是閉包。也就是說,閉包讓你可以在一個內層函式中訪問到其外層函式的作用域。ps:該定義被簡化,原話在閉包 - JavaScript | MDN

function count() {
let record = 0
return function f() {
return record++
}
} let counter = count()

f()函式和其詞法環境是一個閉包,或者將視野往上看,count()函式的作用域下就是一個閉包,內層函式f()在閉包的作用下,可以訪問外層函式的作用域內的任何區域性變數。