閉包(closure)是javascript語言的一個難點,許多高級應用都需要 它來實現(xiàn)。
一、變量的作用域
js語言的變量可以分為局部變量和全局變量。js的獨特之處就在于函數(shù)內(nèi)部可以直接讀取全局變量。
var n = 999;
function f1(){
var m = 666;
alert(n);
}
f1(); //999 函數(shù)f1會從父集作用域讀取全集變量n
alert(m); //error 無法讀取函數(shù)局部變量m
二、如何從外部讀取局部變量
出于某些原因,有時我們需要從外部讀取函數(shù)內(nèi)部變量。這時候就通過變通的方式實現(xiàn):在函數(shù)內(nèi)部再定義一個函數(shù):
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result = f1();
result(); // 999
上面的代碼中,f2可以讀取f1中的局部變量,那么只要把f2做為返回值,我們就可以在f1外部讀取它的內(nèi)部變量了。
這里插播一下:
f1()=> f2(){....}
當我們執(zhí)行 f1得到的是f2的函數(shù)申明,當需要執(zhí)行該函數(shù)時,需要把返回的f2當作一個整體來執(zhí)行,除了下面申明一個result的方式外,還有兩種寫法:
(f1(){...} )()
( f1(){...} ())
上面代碼塊中的f2函數(shù)就是閉包。
三、閉包的用途
閉包最大的用處有兩個:1.可以讀取函數(shù)內(nèi)部的函數(shù) 2.讓這些變量的值始終保持在內(nèi)存中。