手を取って教えます.JavaScriptの中でブロックレベルの作用領域を真似します.

2483 ワード

JavaScriptはブロックレベルのスコープの概念がないので、ブロックステートメントで定義された変数は、実際に関数に含まれています.
function outputNumbers(count) {
    for (var i = 0; i < count; i++) {
        console.log(i);
    }
    console.log(i);//10
}
outputNumbers(10);
ここのiは関数outputNumbers()の活動対象に定義されているので、その定義から関数内部で自由にアクセスできます.このように同じ変数を再宣言しても、その値は変わりません.JavaScriptはこのような状況を無視します.
function outputNumbers(count) {
    for (var i = 0; i < count; i++) {
        console.log(i);
    }
    var i;//      
    console.log(i);//10(      )
}
outputNumbers(10);
ブロックレベルのスコープを模倣する匿名関数を使用することができ、構文は以下の通りである.
(function(){
    //     
})();
上記のコードを定義し、直ちに匿名関数を呼び出しました.ここでは関数宣言をペアの括弧に入れます.これは関数式の書き方です.この関数は、次のペアの括弧に続くとすぐに呼び出されます.
いくつかの場所で臨時変数を使用するには、このような文法を使って作成されたプライベートドメインがあります.
function outputNumbers(count) {
    (function () {
        for (var i = 0; i < count; i++) {
            console.log(i);
        }
    })();

    console.log(i);//  
}
outputNumbers(10);
forループの外部にプライベートロールドメインを挿入したので、匿名関数で定義された任意の変数は、実行終了後に破棄されます.また、匿名関数が閉じているので、変数countにアクセスすることができます.
この技術は大域作用域で関数の外部に用いられ、大域作用域に過剰な変数と関数を追加することに制限される.
注意:このようにすれば、クローズドのメモリを減らすことができます.また、匿名関数への参照がないので、関数の実行が完了すれば、直ちに効果ドメインチェーンを廃棄できます.