自己對閉包的理解(保證能看懂)

2022-04-28 03:06:05 字數 4094 閱讀 7880

看了很多的關於閉包的文章,你不是還是一頭霧水,還是不理解閉包的意義。

最近我看了一篇文章,關於閉包的講解,可以說是講得非常通俗易懂,於是記錄下來,以便加深理解。

閉包函式:宣告在乙個函式中的函式,叫做閉包函式。

閉包:內部函式總是可以訪問其所在的外部函式中宣告的引數和變數,即使在其外部函式被返回(壽命終結)了之後。

讓外部訪問函式內部變數成為可能;

區域性變數會常駐在記憶體中;

可以避免使用全域性變數,防止全域性變數汙染;

會造成記憶體洩漏(有一塊記憶體空間被長期占用,而不被釋放)

閉包就是可以建立乙個獨立的環境,每個閉包裡面的環境都是獨立的,互不干擾。閉包會發生記憶體洩漏,每次外部函式執行的時 候,外部函式的引用位址不同,都會重新建立乙個新的位址。但凡是當前活動物件中有被內部子集引用的資料,那麼這個時候,這個資料不刪除,保留一根指標給內部活動物件。

閉包記憶體洩漏為: key = value,key 被刪除了 value 常駐記憶體中; 區域性變數閉包公升級版(中間引用的變數) => 自由變數;

看到這裡你是不是已經懵了,不知道在講什麼。。。。下面乾貨來了:重點重點重點,重要的事情說三遍。。。

最終秘訣就這一句話,每個例子請自行帶入這個結論!!!!!!!!!!!!!

/* 例子1 */

1

function

funa()6}

7var b =funa();

8 b(); //

10

/* 例子2 */

1

function

outerfn()

7return

innerfn;8}

9var inner = outerfn(); //

每次外部函式執行的時候,都會開闢一塊記憶體空間,外部函式的位址不同,都會重新建立乙個新的位址

10inner();

11inner();

12inner();

13var inner2 =outerfn();

14inner2();

15inner2();

16 inner2(); //

1 2 3 1 2 3

1

var i = 0;

2function

outerfn()

7return

innnerfn;8}

9var inner1 =outerfn();

10var inner2 =outerfn();

11inner1();

12inner2();

13inner1();

14 inner2(); //

1 2 3 4

/* 例子4*/

1

function

fn()6}

7 alert(fn()()); //

48 alert(fn()()); //

4

/* 例子5*/

1

unction 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*/

1

function

a()

4return

b; 5} 6

var c =a();

7 c(); //

1 8 c(); //

2

/*例子8*/

1

function

f() 7}

8var t1 =f();

9 t1(); //

1 10 t1(); //

2 11 t1(); //

3

/*例子9*/

1

var add = function

(x)

7 tmp.tostring = function

() 10

return

tmp;

11}

12 alert(add(1)(2)(3)); //

6

/*例子10*/

1

var lis = document.getelementsbytagname("li");

2for(var i=0;i);

7 })(i); //

事件處理函式中閉包的寫法

8 }

/*例子11*/

1

function

m1()6}

78 m1()(); //

29 m1()(); //

210 m1()(); //211

12var m2 =m1();

13 m2(); //

214 m2(); //

315 m2(); //

4

/*例子12*/

1

var fn=(function()6

return

fn;7

})()

8 fn(); //

119 fn(); //

12

/*例子13*/

1

function

love1()

6 num++;

7return

me1;8}

9var loveme1 =love1();

10 loveme1(); //

輸出224

/*例子14*/

1

function

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*/

1

function

fn()7}

8return

arr;9}

10var list =fn();

11for(var i = 0,len = list.length;i < len ; i ++) //

5 5 5 5 5

/*例子16*/

1

function

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 ...