看了很多的關於閉包的文章,你不是還是一頭霧水,還是不理解閉包的意義。
最近我看了一篇文章,關於閉包的講解,可以說是講得非常通俗易懂,於是記錄下來,以便加深理解。
閉包函式:宣告在乙個函式中的函式,叫做閉包函式。
閉包:內部函式總是可以訪問其所在的外部函式中宣告的引數和變數,即使在其外部函式被返回(壽命終結)了之後。
讓外部訪問函式內部變數成為可能;
區域性變數會常駐在記憶體中;
可以避免使用全域性變數,防止全域性變數汙染;
會造成記憶體洩漏(有一塊記憶體空間被長期占用,而不被釋放)
閉包就是可以建立乙個獨立的環境,每個閉包裡面的環境都是獨立的,互不干擾。閉包會發生記憶體洩漏,每次外部函式執行的時 候,外部函式的引用位址不同,都會重新建立乙個新的位址。但凡是當前活動物件中有被內部子集引用的資料,那麼這個時候,這個資料不刪除,保留一根指標給內部活動物件。
閉包記憶體洩漏為: key = value,key 被刪除了 value 常駐記憶體中; 區域性變數閉包公升級版(中間引用的變數) => 自由變數;
看到這裡你是不是已經懵了,不知道在講什麼。。。。下面乾貨來了:重點重點重點,重要的事情說三遍。。。
最終秘訣就這一句話,每個例子請自行帶入這個結論!!!!!!!!!!!!!
/* 例子1 */
1function
funa()6}
7var b =funa();
8 b(); //
10
/* 例子2 */
1function
outerfn()
7return
innerfn;8}
9var inner = outerfn(); //
每次外部函式執行的時候,都會開闢一塊記憶體空間,外部函式的位址不同,都會重新建立乙個新的位址
10inner();
11inner();
12inner();
13var inner2 =outerfn();
14inner2();
15inner2();
16 inner2(); //
1 2 3 1 2 3
1var i = 0;
2function
outerfn()
7return
innnerfn;8}
9var inner1 =outerfn();
10var inner2 =outerfn();
11inner1();
12inner2();
13inner1();
14 inner2(); //
1 2 3 4
/* 例子4*/
1function
fn()6}
7 alert(fn()()); //
48 alert(fn()()); //
4
/* 例子5*/
1unction outerfn()
7return
innnerfn;8}
9var inner1 =outerfn();
10var inner2 =outerfn();
11inner1();
12inner2();
13inner1();
14 inner2(); //
1 1 2 2
/*例子6*/
1 (function()
4function seta(val)
5 window.g =getm;
6 window.f =seta;
7})();
8 f(100);
9 console.info(g()); //
100 閉包找到的是同一位址中父級函式中對應變數最終的值
/*例子7*/
1function
a()
4return
b; 5} 6
var c =a();
7 c(); //
1 8 c(); //
2
/*例子8*/
1function
f() 7}
8var t1 =f();
9 t1(); //
1 10 t1(); //
2 11 t1(); //
3
/*例子9*/
1var add = function
(x)
7 tmp.tostring = function
() 10
return
tmp;
11}
12 alert(add(1)(2)(3)); //
6
/*例子10*/
1var lis = document.getelementsbytagname("li");
2for(var i=0;i);
7 })(i); //
事件處理函式中閉包的寫法
8 }
/*例子11*/
1function
m1()6}
78 m1()(); //
29 m1()(); //
210 m1()(); //211
12var m2 =m1();
13 m2(); //
214 m2(); //
315 m2(); //
4
/*例子12*/
1var fn=(function()6
return
fn;7
})()
8 fn(); //
119 fn(); //
12
/*例子13*/
1function
love1()
6 num++;
7return
me1;8}
9var loveme1 =love1();
10 loveme1(); //
輸出224
/*例子14*/
1function
fun(n,o) 7};
8}9var a = fun(0); //
undefined
10 a.fun(1); //
0 11 a.fun(2); //
0 12 a.fun(3); //
0 13
var b = fun(0).fun(1).fun(2).fun(3); //
undefined 0 1 2
14var c = fun(0).fun(1);
15 c.fun(2);
16 c.fun(3); //
undefined 0 1 1
/*例子15*/
1function
fn()7}
8return
arr;9}
10var list =fn();
11for(var i = 0,len = list.length;i < len ; i ++) //
5 5 5 5 5
/*例子16*/
1function
fn();
8})(i);9}
10return
arr;11}
12var list =fn();
13for(var i = 0,len = list.length;i < len ; i ++) //
0 1 2 3 4
對閉包的理解
閉包是什麼 答 閉包就是能夠讀取其他函式內部變數的函式。閉包函式生效的兩個條件 1 必須先定義乙個匿名函式 2 必須要執行一次匿名函式生成閉包函式 匿名函式 匿名函式 demo1 function name 呼叫匿名函式 echo demo1 張無忌 匿名函式也有自己的作用域,除了傳參,還有什麼方式...
對閉包的簡單理解
閉包是乙個特別抽象的概念,所以本文不會對概念進行解釋。直接寫例子 需要對賦值 程式的執行 返回值有一定的理解 當然本文只是個人對閉包的淺顯的理解,希望能夠對你有所幫助。function fun return funsub var fn fun 執行fun函式,並將funsub函式的位址賦值個fn。f...
對js閉包的理解
在w3c和網上其他地方看了一下閉包,記錄一下個人理解。個人認為,閉包就是乙個函式內包含另乙個函式 然後函式外可以呼叫另乙個函式內的變數或函式返回值。看到這,大家都會覺得。還要你說,傻子都知道。但是,事實就是如此,來段 window.onload function function doreduce ...