UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【JavaScript】クロージャ

JavaScriptクロージャのお話を聞く機会があり、理解していたつもりだが深くはできていなかったことに気づいた

なので、自分でももまとめてみる

Closure(関数閉包)

▼閉じた関数
自分が定義した引数/変数だけを使っている関数

function f (x, y) {
  const z = x + y
  return z
}

▼開いた関数
自分が定義した引数/変数以外を使っている関数

function f (y) {
  const z = x + y
  return z
}

クロージャ(関数閉包)
開いた関数が環境に包まれて閉じられる関数

let x = 1

function f (y) {
  const z = x + y
  return z
}

環境とは

  • スコープとも呼ばれる
  • 変数そのものの集合
    • 変数に格納された値のコピーではないから変更の影響をうける
  • 何重にも入れ子になる
  • キスカルスコープとダイナミックスコープがある

レキシカルスコープとは

  • スタティックスコープとも呼ばれる
  • ソースコードから静的に定まる
  • JavaScriptの基本はレキシカルスコープ
let x = 1
export const f = 
  (y) => {
    return (z) => x + y + z
  }

ダイナミックスコープとは

  • 関数の呼び出しに応じて動的に決まる環境
  • Emacs, Lispなど
  • functionで定義/宣言した関数のthis
  • eval()