Scope 作用域

何謂作用域

  • 作用域就是變數和函數可訪問的範圍。
  • 作用域可分為全局作用域 (Global Scope)函數作用域 (Local Scope) ,但在ES6之後,存在塊作用域 (Block Scope)
  • JS 的作用域採用詞法作用域 (Lexical Scope) 也就是靜態作用域。

什麼是詞法作用域 (Lexical Scope)

函數作用域是在函數定義的時候,就決定了

範例:

const color = 'red'
function f2 () {
  console.log(color)  // red or blue ?
}
function f1 () {
  const color = 'blue'
  f2()
}

答案:red
JS是採用詞法作用域,當f2函數被執行時會查找是否有color變數,如沒有就往外找color變數

全局作用域 (Global Scope)

全局作用域是在函數以外變數,表示該變數可以在任何地方訪問。
所有函數都可以訪問全局作用域內定義的變數

let global = 'G'
function globalScope () {
  return global
}

函數作用域 (Local Scope)

變數定義在函數裡面,表示函數作用域或局部作用域,只有函數內才可以訪問,外部作用域無法訪問。

let local = 'L'
function localScope () {
  // 首先會查看函數內是否有定義local變數
  // 如果發現有就會到此為止
  // 如果沒有,JS engine就會查看外面一層函數,然後是在往外一層函數,以此類推,一直到到達全局作用域
  console.log(local)
  const innerLocal = 'Inner'
}

如果JavaScript Engine檢查了所有外層函數和全局作用域,仍然找不到此變數的話,會報錯!

特別注意

全局變數很好用很方便,在任何地方都可以被訪問。
但特別小心,就是命名空間發生衝突,或者說一不小心覆蓋全局變數的值,影響其他程式運作。如果程式越寫越大,你也很難追蹤此變數的值,非常⚠️