範圍鏈 Scope Chain
解析下方範例:
- 呼叫outer(a)帶入參數a 進去outer()內部
 - 看到outer()內部呼叫inner(b*3)
 - 進入inner(c)內部,印出a,b,c
 - 此時已知 c = 6因為 a=1, b=a2=2, c=b3=6
 - 但是b,c必須往外找在inner()的外面找到b
 - 在outer()外面找到a
 - 印出 1, 2, 6
 
1  | function outer() {  | 
從上面範例可以看出在inner()內部是找不到a,b變數的,因為往外去尋找,而這個往外尋找的動作就稱為範圍鏈
練習題
這邊result印出結果是什麼呢?
1  | var msg = "global."  | 
- 先看result等於innerFunc()
 - 再看到innerFunc()等於outer()
 - 看到outer()內,return inner()
 - 看到inner()內,return msg
 - 這邊因為inner內部找不到變數msg所以往外找找到了 = local.
 - 故印出local.
 
這題的考點是:
- 外部環境的連結是在函式宣告當下就決定了而不是在乎叫的時候
 - 所以inner的外層就是outer也就可以在這找到msg變數
 
當內部 (inner) 函式被回傳後,除了自己本身的程式碼外,也可以 穿越 取得了內部函式「當時環境」的變數值,記住了執行當時的環境,這就是「閉包」。