一つの閉鎖的な小さい例

1062 ワード

まず、作用領域の概念を説明します.
    JavaScriptでは、関数だけがスコープを持っています.つまり、関数内で宣言された変数は、関数の外部にアクセスできません.
関数に定義されている変数は、変更関数の埋め込み関数でアクセスできます.
まず、作用領域の例を挙げます.
function foo(){
    var a = 10;
    function bar(){
        a *= 2;
        return a;
    }
    return bar;
}
    この例では、aは関数fooに定義されているが、関数barはfooにも定義されているので、これにアクセスすることができる.barは実行中にaをaに2を掛けます.barがfooで呼び出されるとaにアクセスできるということは理解できる.もしbarがfooの外部で呼び出されたら?
function foo(){
    var a = 10;
    function bar(){
        a *= 2;
        return a;
    }
    return bar;
}

var baz = foo();//baz bar     
baz();//returns 20
baz();//returns 40
baz();//returns 80

var blat = foo();//blat bar        
blat();//returns 20,    a      
    上記のコードでは、戻り値のbar関数への参照が変数bazに与えられます.この関数は現在fooの外部で呼び出されていますが、依然としてaにアクセスできます.これはJavaScriptの中の作用域が語法的なためです.関数は、呼び出しの役割領域ではなく、それらを定義する作用領域で動作します.barがfooに定義されている限り、fooで定義されているすべての変数にアクセスできます.たとえfooの実行が終了しても.
    これは閉包の一例です.fooが戻った後、そのスコープは保存されましたが、このスコープにはその関数だけがアクセスできます.前の例では、bazとblatは、それぞれこの作用領域およびaのコピーを有しており、それら自身だけが修正できる.埋め込み関数を返します.