最新のWeb開発のチュートリアル
×

JS チュートリアル

JS HOME JS 導入 JS どこへ JS 輸出 JS 構文 JS ステートメント JS 注釈 JS 変数 JS 演算子 JS 算術 JS 割り当て JS データの種類 JS 機能 JS オブジェクト JS 範囲 JS イベント JS ストリング JS 文字列メソッド JS 数字 JS 数のメソッド JS 数学 JS 日付 JS 日付形式 JS 日付の方法 JS 配列 JS アレイ方式 JS ブール値 JS 比較 JS 条件 JS スイッチ JS ループ For JS ループしながら JS ブレーク JS 型変換 JS 正規表現 JS エラー JS デバッギング JS 巻き上げ JS strictモード JS スタイルガイド JS ベストプラクティス JS 間違い JS パフォーマンス JS 予約語 JS JSON

JS フォーム

フォームバリデーション フォームAPI

JS オブジェクト

オブジェクト定義 オブジェクトのプロパティ オブジェクトメソッド オブジェクトプロトタイプ

JS 機能

関数定義 ファンクションのパラメータ 関数の呼び出し 関数クロージャ

JS HTML DOM

DOM イントロ DOM メソッド DOM 資料 DOM 要素 DOM HTML DOM CSS DOM アニメーション DOM イベント DOM EventListener DOM ナビゲーション DOM ノード DOM ノードリスト

JS ブラウザ BOM

JS Window JS Screen JS Location JS History JS Navigator JS Popup Alert JS Timing JS Cookies

JS

JS 例 JS HTML DOM JS HTML 入力 JS HTML オブジェクト JS HTML イベント JS ブラウザ JS クイズ JS 概要

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

JavaScript オブジェクト HTML DOM オブジェクト


 

JavaScript Closures


JavaScript変数は、 ローカルまたはグローバルスコープに属することができます。

プライベート変数は、 クロージャで可能となります。


グローバル変数

関数は、このような関数の内部で定義されているすべての変数にアクセスすることができます。

function myFunction() {
    var a = 4;
    return a * a;
}
»それを自分で試してみてください

しかし、この関数はまた、このように、関数外で定義され変数にアクセスすることができます。

var a = 4;
function myFunction() {
    return a * a;
}
»それを自分で試してみてください

最後の例では、 グローバル変数です。

Webページでは、グローバル変数はwindowオブジェクトに属します。

グローバル変数は、ページ内のすべてのスクリプトで使用(および変更)することができます(とウィンドウ)。

最初の例では、 ローカル変数です。

ローカル変数は、それが定義されている関数の内部で使用することができます。 これは、他の機能やその他のスクリプトコードから隠されています。

同じ名前のグローバル変数とローカル変数は異なる変数です。 1を変更すると、他は変更されません。

varキーワードなしで作成された変数は、それらが関数の内部で作成されていても、常にグローバルです。


変数の寿命

グローバル変数は、アプリケーション限り、生きて(/ウェブページあなたのウィンドウが)住んでいます。

ローカル変数は、短い命を持っています。 これらは、関数が呼び出されたときに作成され、関数が終了すると削除されます。


カウンターのジレンマ

あなたが何かをカウントするための変数を使用すると仮定し、あなたは、このカウンタは、すべての機能が利用できるようにしたいです。

あなたはカウンターを増加させるために、グローバル変数、および関数を使用することができます。

var counter = 0;

function add() {
    counter += 1;
}

add();
add();
add();

// the counter is now equal to 3
»それを自分で試してみてください

カウンターのみによって変更されるべきであるadd()関数。

問題は、ページ上の任意のスクリプトが呼び出さずに、カウンタを変更することができること、であるadd()

私は関数の内部カウンタを宣言した場合、誰も()を追加呼び出すことなく、それを変更することができなくなります。

function add() {
    var counter = 0;
    counter += 1;
}

add();
add();
add();

// the counter should now be 3, but it does not work !
»それを自分で試してみてください

それは効かなかった! I呼び出すたびにadd()関数は、カウンタは1に設定されています。

JavaScriptの内側の関数はこれを解決することができます。


JavaScriptの入れ子関数

すべての関数はグローバルスコープへのアクセス権を持っています。

実際には、JavaScriptで、すべての機能がそれらを「上」スコープへのアクセス権を持っています。

JavaScriptは、ネストされた関数をサポートしています。 ネストされた関数は、それらの「上」スコープへのアクセス権を持っています。

この例では、内側の関数plus()親関数内でカウンタ変数にアクセスする場合があります:

function add() {
    var counter = 0;
    function plus() {counter += 1;}
    plus();   
    return counter;
}
»それを自分で試してみてください

我々は達することができる場合、これは、カウンタのジレンマを解決している可能性がplus()外から関数を。

我々はまた、一度だけカウンタ= 0を実行するための方法を見つける必要があります。

私たちは、閉鎖を必要とします。


JavaScriptのクロージャ

自己起動機能を覚えていますか? この関数は何をするのでしょうか?

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();

add();
add();
add();

// the counter is now 3
»それを自分で試してみてください

例の説明しました

変数の追加は、自己呼び出す関数の戻り値が割り当てられます。

自己呼び出す関数は一度だけ実行されます。 これは、ゼロ(0)にカウンタを設定し、関数式を返します。

この方法では、関数となる追加します。 「素晴らしい」の部分は、それが親スコープにカウンタにアクセスできることです。

これは、JavaScriptのクロージャと呼ばれているそれは、それが可能な機能は、 " プライベート "変数を持つようになります。

カウンタは、匿名関数の範囲によって保護されており、唯一の追加機能を使用して変更することができます。

クロージャは、親関数が閉じられた後も、親スコープにアクセスする機能です。