閉包(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>
由於ie
的js
物件和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 閉包的用法詳解
實現可重用的區域性變數,且保護其不受汙染的機制。外層函式包裹受保護的變數和內層函式。內層函式專門負責操作外層函式的區域性變數。將內層函式返回到外層函式外部,反覆呼叫。子函式會一級一級地向上尋找所有父函式的變數。所以,父函式的所有變數,對子函式都是可見的,反之則不成立。外層函式呼叫了幾次,就有幾個受保...