一、閉包定義
一個擁有許多變量和綁定了這些變量的環(huán)境的表達式(通常是一個函數(shù))喂柒,因而這些變量也是該表達式的一部分不瓶。
(1)作為一個函數(shù)變量的一個引用,當函數(shù)返回時灾杰,其處于激活狀態(tài)蚊丐。
(2)一個閉包就是當一個函數(shù)返回時,一個沒有釋放資源的棧區(qū)艳吠。
二麦备、閉包應用
看了閉包的定義,也許您還覺得云里霧里昭娩,下面我們通過一個示例子閉包的應用凛篙。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript閉包</title>
</head>
<body>
<script type="text/javascript">
function init() {
var arrays = document.getElementsByTagName("p");
for( var i=1; i<=arrays.length; i++ ) {
arrays[i].onclick = function() {
alert(i);
}
}
}
</script>
</head>
<body onload="init();">
<p>產(chǎn)品一</p>
<p>產(chǎn)品二</p>
<p>產(chǎn)品三</p>
<p>產(chǎn)品四</p>
<p>產(chǎn)品五</p>
</body>
</html>
上述代碼,運行效果是栏渺,不管點擊任何一個P元素呛梆,輸出的結(jié)果都是5。
如何實現(xiàn)點擊產(chǎn)品一 輸出1迈嘹、點擊產(chǎn)品二 輸出2削彬、點擊產(chǎn)品三 輸出3 以此類推?
方案1 將變量保存在每個P元素對象上
function init() {
var arrays = document.getElementsByTagName("p");
for( var i=1; i<=arrays.length; i++ ) {
arrays[i-1].i = i;
arrays[i-1].onclick = function() {
alert(this.i);
}
}
}
方案2 使用閉包全庸,以參數(shù)的方式傳遞
function init() {
var arrays = document.getElementsByTagName("p");
for( var i=1; i<=arrays.length; i++ ) {
(function(arg){
arrays[i-1].onclick = function() {
alert(arg);
};
})(i);
}
}
方案3 使用閉包秀仲,返回一個函數(shù)作為響應事件(與方案2有細微差別)
function init() {
var arrays = document.getElementsByTagName("p");
for( var i=1; i<=arrays.length; i++ ) {
(function(arg){
arrays[i-1].onclick = function() {
return function(){
alert(arg)
};
};
})(i);
}
}
方案4 使用閉包融痛,以調(diào)用時局部變量
function init() {
var arrays = document.getElementsByTagName("p");
for( var i=1; i<=arrays.length; i++ ) {
(function(){
var temp = i;
arrays[i-1].onclick = function() {
alert(temp);
};
})();
}
}
方案5 使用匿名函數(shù)保存在函數(shù)自身
function init() {
var arrays = document.getElementsByTagName("p");
for( var i=1; i<=arrays.length; i++ ){
(arrays[i-1].onclick = function() {
//arguments.callee 表示函數(shù)對象自身的引用
alert(arguments.callee.i);
}).i = i;
}
}
方案6 使用Function實現(xiàn),實際上是產(chǎn)生一個閉包
function init() {
var arrays = document.getElementsByTagName("p");
for( var i=1; i<=arrays.length; i++ ) {
arrays[i-1].onclick = new Function("alert(" + i + ");");
}
}
方案7 使用Function (與6有細微差別一個new 一個沒)
function init() {
var arrays = document.getElementsByTagName("p");
for( var i=1; i<=arrays.length; i++ ) {
arrays[i-1].onclick = Function("alert(" + i + ");");
}
}