閉包是javascript語言的一個難點,須要有足夠的邏輯思惟能力。javascript
變量分爲兩種:全局變量和局部變量。java
1.在函數內部是能夠直接讀取到全局變量的,以下:閉包
var n = 10; function fn(){ alert(n); } fn(); alert結果爲10.
2.在函數外部確定是沒法讀取到函數內的局部變量的,以下模塊化
function f(){ var n = 20; }
f(); alert(n); 程序會報錯:n is no defined.
注意:你們在這個地方須要注意是,在函數內部聲明變量的時候,必定加var。若是不加,至關於聲明瞭一個全局變量。函數
咱們這裏就引入這個閉包,來實現,就是在一個函數內在引入一個函數。性能
function f1(){ var n = 10; function f2(){ alert (n); } return f2; } var result = f1(); result(); 結果就爲:10
閉包:就是可以讀取其它函數內部函數的變量。學習
其實能夠簡單的理解爲:定義在一個函數內部的函數,像好比上面例子中的函數f2()。spa
閉包在本質上就是將函數內部和函數外部鏈接在一塊兒的橋樑。code
1.能夠讀取函數內部的變量。blog
2.變量持久化(變量的值始終會保存在內存中)。
function f1(){ var n = 10; return function(){ n++; alert(n); } } var result = f1(); //外部函數賦給變量result; result(); //result函數第一次執行,結果爲11; result(); //result函數第二次執行,結果爲12,實現了累加,
上面這個例子就完美詮釋了變量的持久化。
3.模塊化代碼,減小全局變量的污染。
var abc = (function(){ //abc爲外部匿名函數的返回值 var a = 1; return function(){ a++; alert(a); } })(); abc(); //2 ;調用一次abc函數,實際上是調用裏面內部函數的返回值 abc(); //3
1.因爲閉包會使函數內部中的變量都保存在來,內存消耗很大。因此不能濫用閉包,不然會形成網頁的性能問題。