一つの閉鎖的な小さい例
1062 ワード
まず、作用領域の概念を説明します.
JavaScriptでは、関数だけがスコープを持っています.つまり、関数内で宣言された変数は、関数の外部にアクセスできません.
関数に定義されている変数は、変更関数の埋め込み関数でアクセスできます.
まず、作用領域の例を挙げます.
これは閉包の一例です.fooが戻った後、そのスコープは保存されましたが、このスコープにはその関数だけがアクセスできます.前の例では、bazとblatは、それぞれこの作用領域およびaのコピーを有しており、それら自身だけが修正できる.埋め込み関数を返します.
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のコピーを有しており、それら自身だけが修正できる.埋め込み関数を返します.