English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JavaScript基本チュートリアル

JavaScriptオブジェクト

JavaScript関数

JSHTMLDOM

JSブラウザBOM

AJAX基本チュートリアル

JavaScriptリファレンスマニュアル

JavaScript 閉包

JavaScriptの変数は属するできますローカルスコープまたはグローバルスコープ

使用できますクロージャグローバル変数をローカル(プライベート)に設定します。

なぜクロージャが必要ですか?

ある物をカウントする変数を使用し、すべての関数でカウンタが使用できるようにしたいとします。

グローバル変数とカウンタを増加させる関数を使用できます:

// カウンタを初期化する
var counter = 0;
// カウンタを増加させる関数
function increment() {
  counter++;
}
// increment()を呼び出します 3回
increment();
increment();
increment();
// 現在はこのカウンタが3
document.getElementById("output").innerHTML = `カウンタ: ${counter}`;
テストを見て‹/›

上面的解决方案存在一个问题:页面上的任何代码都可以更改计数器,而无需调用increment()。

JavaScriptの内部関数はこの問題を解決できます。

JavaScript ネスト関数

JavaScriptはネスト関数をサポートしています。ネスト関数は上層のスコープにアクセスできます。

この例では、内部関数は外部関数内のカウンタ変数にアクセスできます:

function outer() {
  var counter = 0;
  function inner() {
      counter++;
  }
  return counter; 
}
テストを見て‹/›

ネスト関数は前の問題を解決できます、inner()関数を外部からアクセスできる場合です。

さらにcounter = 0を一度だけ実行する方法を見つける必要があります、それが以下で説明される閉包です。

JavaScript 閉包

閉包は関数とその関数を宣言する文法的環境の組み合わせです。

閉包は別の関数のスコープから変数にアクセスできます。これは関数内部で関数を作成することで実現されます。もちろん、外部関数は内部スコープにアクセスできません。

var increment = (function() {
  var counter = 0;
  function inner() {
      return ++counter;
  }
  return inner;
})();
テストを見て‹/›

変数の増分に自関数の返値が割り当てられます。

自関数は一度だけ実行されます。カウンタを0に設定し、関数式を返します。

閉包は親関数が閉じられていても、親スコープにアクセスできる関数です。