1.閉包的概念
-
JavaScript中什么是閉包?
首先我們要知道在JavaScript中趾盐,函數(shù)中聲明變量函數(shù)外是無法訪問的冒嫡,即js中函數(shù)是具有變量作用域隔離特性的一個內(nèi)存結(jié)構(gòu),這種情況我們稱之為“閉包”瓤的。
-
閉包在JavaScript中要解決的問題是啥爵政?
其實說白了就是間接的訪問到被函數(shù)隔離的數(shù)據(jù)。
-
怎樣實現(xiàn)閉包的間接訪問呢?
這里有一個誤區(qū)就是我直接在函數(shù)里return不就可以了嗎蓬抄?
function foo () { var num = 123; // 原始數(shù)據(jù) return num; } var res1 = foo();//這個還是num的原始數(shù)據(jù)嗎? var res2 = foo(); alert(res1+'-----'+res2);//這里res1與res2都是123. 一些初學(xué)者覺得這樣就可以證明訪問到的是原始數(shù)據(jù)了夯到。然而并不是嚷缭。 //我們再看下面一段代碼 function foo1 () { var num = Math.random(); // 原始數(shù)據(jù) return num; } var res3 = foo(); var res4 = foo(); alert(res3+'-----'+res4);//這里的res3與res4就永遠(yuǎn)不會相同。這不就是證明了我們訪問到的num并不是原始數(shù)據(jù)耍贾。
為什么會出現(xiàn)上面兩種情況呢阅爽?因為函數(shù)是引用數(shù)據(jù)類型(復(fù)合數(shù)據(jù)類型),每一次調(diào)用函數(shù)荐开,會重新開辟一個內(nèi)存空間付翁。而我們看到的res1與res2相等只是他們兩個內(nèi)存空間里的數(shù)據(jù)是一樣的。但是并不是同一個數(shù)據(jù)晃听。
雖然這樣直接return得到的不是原始數(shù)據(jù)百侧,但是這種思路是對的着帽。我們可以在函數(shù)里面利用函數(shù)的返回訪問原始數(shù)據(jù)。我們再看下面一段代碼移层。
function foo () {
var num = Math.random(); // 原始數(shù)據(jù)
return function() {
return num; // 它就是原始數(shù)據(jù) num
}
}
var res=foo();
var res1 = res();
var res2 = res();
alert(res1+'-----'+res2);//這里我們可以看到res1與res2完全相等仍翰。
根據(jù)上面的代碼可以看出,只要我們保證我們return回去的內(nèi)容就是存儲數(shù)據(jù)的內(nèi)存地址观话。那么我們就可以在外部訪問函數(shù)內(nèi)部的原始數(shù)據(jù)予借。即‘閉包’要解決的問題就很好的解決了。
-
閉包的實現(xiàn)各種特性的根本核心频蛔。
1.帶有私有數(shù)據(jù)的函數(shù)
2.帶有私有數(shù)據(jù)的對象(函數(shù)也是對象)
-
閉包的應(yīng)用----沙箱模式
沙箱模式能干嗎灵迫?
我們寫js代碼的時候經(jīng)常聲明變量,這樣變量一多晦溪。我們可能出現(xiàn)沖突的可能性變大瀑粥。
因為沙箱就是一個隔離的執(zhí)行環(huán)境∪玻可以讓代碼之間互不影響狞换。
我們熟悉的jQuery就是運(yùn)用沙箱開發(fā),還有市面上一些流行前端框架也使用了沙箱舟肉。//沙箱的基本結(jié)構(gòu) (function(){ //這種模式就是沙箱模式結(jié)構(gòu) //所有代碼寫在這里 })();