詳解js閉包

2022-09-13 00:42:32 字數 3054 閱讀 7283

閉包(closure)是j**ascript語言的乙個難點,也是它的特色,很多高階應用都要依靠閉包實現。

閉包有三個特性:

1.函式巢狀函式

2.函式內部可以引用外部的引數和變數

3.引數和變數不會被垃圾**機制**

閉包是指有權訪問另乙個函式作用域中的變數的函式,建立閉包的最常見的方式就是在乙個函式內建立另乙個函式,通過另乙個函式訪問這個函式的區域性變數

閉包的缺點就是常駐記憶體,會增大記憶體使用量,使用不當很容易造成記憶體洩露。

閉包是j**ascript語言的一大特點,主要應用閉包場合主要是為了:設計私有的方法和變數。

一般函式執行完畢後,區域性活動物件就被銷毀,記憶體中僅僅儲存全域性作用域。但閉包的情況不同!

function aaa() ;  

}

var fun = aaa();

fun();// 1 執行後 a++,,然後a還在~

fun();// 2

fun = null;//a被**!!

閉包會使變數始終儲存在記憶體中,如果不當使用會增大記憶體消耗。

(1)、在j**ascript中,如果乙個物件不再被引用,那麼這個物件就會被gc**; 

(2)、如果兩個物件互相引用,而不再被第3者所引用,那麼這兩個互相引用的物件也會被**。

那麼使用閉包有什麼好處呢?使用閉包的好處是:

1.希望乙個變數長期駐紮在記憶體中

2.避免全域性變數的汙染

3.私有成員的存在

var a = 1;

function abc()

abc(); //2

abc(); //3

script>

function abc()

abc(); //2

abc(); //2

script>

那麼怎麼才能做到變數a既是區域性變數又可以累加呢?

function outer()

}var y = outer(); //外部函式賦給變數y;

y(); //y函式呼叫一次,結果為11,相當於outer()();

y(); //y函式呼叫第二次,結果為12,實現了累加

script>

在js中我們可以通過關鍵字function來宣告乙個函式:

function abc()

abc();

script>

我們也可以通過乙個"()"來將這個宣告變成乙個表示式:

(function ())();                   //然後通過()直接呼叫前面的表示式即可,因此函式可以不必寫名字;

script>

var abc = (function()

})();

abc(); //2 ;呼叫一次abc函式,其實是呼叫裡面內部函式的返回值

abc(); //3

script>

var aaa = (function()

function ccc()

return

})();

aaa.b(); //2

aaa.c() //3

script>

//使用匿名函式實現區域性變數駐留記憶體中,從而實現累加

function box();

} var b = box();

alert(b());

alert(b()); //即alert(box()());

alert(b());

alert(b); // function ()

b = null; //解除引用,等待垃圾**

script>

過度使用閉包會導致效能的下降。函式裡放匿名函式,則產生了閉包

title>

window.onload = function();}}

script>

head>

123li>

456li>

789li>

010li>

ul>

body>

html>

title>

window.onload = function();

})(i);}};

script>

head>

123li>

456li>

789li>

ul>

body>

html>

由於iejs物件和dom物件使用不同的垃圾收集方法,因此閉包在ie中會導致記憶體洩露問題,也就是無法銷毀駐留在記憶體中的元素

function closure();

}closure();

//最後應將odiv解除引用來避免記憶體洩露

function closure();

odiv = null;

}

JS閉包詳解

1.先看看常見的例子吧 var fn null function foo fn innerfoo foo bar 下面我們通過斷點除錯的方法來看看執行順序 fn null foo foo 內部 a 2 fn innerfoo bar bar 內部 fn innerfoo 內部console.log ...

詳解JS閉包概念

閉包理解 1.如何產生閉包?當乙個巢狀的內部 子 函式引用了巢狀的外部 父 函式的變數 函式 時,產生閉包 2.閉包到底是什麼?使用 chrome 除錯檢視 理解一 閉包是巢狀的內部函式 絕大部分人 理解二 包含被引用變數 函式 的物件 極少數人 注意 閉包存在於巢狀的內部函式中 3.產生閉包的條件...

js 閉包的用法詳解

實現可重用的區域性變數,且保護其不受汙染的機制。外層函式包裹受保護的變數和內層函式。內層函式專門負責操作外層函式的區域性變數。將內層函式返回到外層函式外部,反覆呼叫。子函式會一級一級地向上尋找所有父函式的變數。所以,父函式的所有變數,對子函式都是可見的,反之則不成立。外層函式呼叫了幾次,就有幾個受保...