1. 程式人生 > >關於閉包-我的淺顯理解

關於閉包-我的淺顯理解

關於閉包,我會想問:閉包咋來的(來源),閉包是啥(概念),閉包存在在什麼地方(結構),閉包怎麼用,閉包優缺點..順著這“一條龍”的問法,來串串閉包的歷史,就像老師講歷史一樣,有問題才有進步,有需求才有市場嘛,不扯了開敲..

1.閉包是咋來的:

函式中的變數,有全域性變數和區域性變數之分,全域性變數能在函式的任何地方被訪問(易汙染),區域性變數只能沿作用域鏈向上訪問卻不能在函式外部訪問(人家不易被汙染),且函式執行完,區域性變數將被釋放(不可重用)。

so.為了解決全域性的易汙染、區域性的不可重用,soso.閉包就來了...

2.閉包是啥:

閉包是一個能夠讀取其他函式區域性變數的函式。先拋一個大神寫的例子:

function tea(){

var n=1;

function blackTea(){

console.log(n++);

}

return blackTea;

}

var Tea = tea();

Tea();

Tea();

這例子裡的blackTea函式就是閉包了。換匿名寫法:

function tea(){

var n=1;

return function (){

console.log(n++);//這個n是內層函式向上訪問外層函式的區域性變數而來的,做到了複用區域性變數

}

}

var Tea = tea();

Tea();

Tea();

3.閉包存在在什麼地方:

直接看blackTea函式存在在整個大函式的位置。

4.閉包怎麼用:再上一個例子好了

var type = "the flowers";

var girls_accept = {

type : "the grass",

whoAccepts : function(){

return function(){

return this.type

}

}

}

var accept = girls_accept.whoAccepts();

accept();

-------------------------------------------------------------------------------------------------------

var type = "the flowers";

var girls_accept = {

type : "the grass",

whoAccepts : function(){

var that = this;====>//非常重要:外層函式要申明這個變數,確定為外層函式的區域性變數

return function(){

return that.type

}

}

}

var accept = girls_accept.whoAccepts();

accept();

5.閉包的優缺點:

記憶體易洩露:==>易造成記憶體洩露問題(<==var申明變數卻沒使用、定時器中任務函式直接是字串等)。

效能問題