入れ子の関数とスコープ

関数スコープ宣言前の参照の仕組みは入れ子の関数でも同様。

内側関数の実行より後で宣言されたvar変数とlet変数とで、違いに注意。

let a = '外側'
let b = '外側'
let c = '外側'

外側関数()

function 外側関数() {
  // 実行より前で宣言: 内側から参照できる。
  let a = '内側'
  // 関数宣言の定義の位置ではなく、実行の位置による。
  内側関数()
  // 実行より後で宣言: letとvarでは挙動が異なる。
  var b = '内側'
  let c = '内側'

  function 内側関数() {
    console.log(a, b) // '内側' undefined
    // c // ReferenceError
  }
}