淺析Javascript閉包的特性
Javascript閉包的定義非?;逎]包,是指語(yǔ)法域位于某個(gè)特定的區(qū)域,具有持續(xù)參照(讀寫(xiě))位于該區(qū)域內(nèi)自身范圍之外的執(zhí)行域上的非持久型變量值能力的段落。這些外部執(zhí)行域的非持久型變量神奇地保留它們?cè)陂]包最初定義(或創(chuàng)建)時(shí)的值(深連結(jié))。
簡(jiǎn)單來(lái)說(shuō),Javascript閉包就是在另一個(gè)作用域中保存了一份它從上一級(jí)函數(shù)或作用域取得的變量(鍵值對(duì)),而這些鍵值對(duì)是不會(huì)隨上一級(jí)函數(shù)的執(zhí)行完成而銷(xiāo)毀。周愛(ài)民說(shuō)得更清楚,閉包就是“屬性表”,閉包就是一個(gè)數(shù)據(jù)塊,閉包就是一個(gè)存放著“Name=Value”的對(duì)照表。就這么簡(jiǎn)單。但是,必須強(qiáng)調(diào),閉包是運(yùn)行期概念,一個(gè)函數(shù)實(shí)例。
Javascript閉包的實(shí)現(xiàn),通常是在函數(shù)內(nèi)部再定義函數(shù),讓該內(nèi)部函數(shù)使用上一級(jí)函數(shù)的變量或全局變量。
ECMAScript認(rèn)為使用全局變量是一個(gè)簡(jiǎn)單的Javascript閉包實(shí)例。
- var sMessage = "Hello World";
 - function sayHelloWorld(){
 - alert(sMessage);
 - };
 - sayHelloWorld();
 
但它完成沒(méi)有體現(xiàn)Javascript閉包的特性……
現(xiàn)在比較讓人認(rèn)同的Javascript閉包實(shí)現(xiàn)有如下三種
- with(obj){
 - //這里是對(duì)象閉包
 - }(function(){
 - //函數(shù)閉包
 - })()try{
 - //...
 - } catch(e) {
 - //catch閉包 但I(xiàn)E里不行
 - }
 
附上今天在無(wú)憂看到的問(wèn)題:
要求:
讓這三個(gè)節(jié)點(diǎn)的Onclick事件都能正確的彈出相應(yīng)的參數(shù)。
- <ul>
 - <li id="a1">aa</li>
 - <li id="a2">aa</li>
 - <li id="a3">aa</li>
 - </ul>
 - <script type="text/javascript">
 - <ul>
 - <li id="a1">aa</li>
 - <li id="a2">aa</li>
 - <li id="a3">aa</li>
 - </ul>
 - <script type="text/javascript">
 - for(var i=1; i < 4; i++){
 - var id = document.getElementById("a" + i);
 - id.onclick = function(){
 - alert(i);//現(xiàn)在都是返回4
 - }
 - }
 - </script>
 
客服果果的解答:
- for(var i=1; i < 4; i++){
 - var id = document.getElementById("a" + i);
 - /*
 - 這里生成了一個(gè)匿名函數(shù)并賦值給對(duì)象 id_i;
 - */
 - id.onclick = function(){
 - /*
 - 這個(gè)i來(lái)源于局部變量,無(wú)法以window.i或者obj.i的形式在后期引用,
 - 只好以指針或者變量地址方式保存在這個(gè)匿名函數(shù)中,
 - 這就是傳說(shuō)的閉包,所以所有這個(gè)過(guò)程中生成的事件句柄都使用引用
 - 的方式來(lái)持久這個(gè)變量,也就是這些匿名函數(shù)共用一個(gè)變量i;
 - */
 - alert(i);
 - };
 - };
 
局部變?nèi)?/P>
- for(var i=1; i < 4; i++){
 - var id = document.getElementById("a" + i);
 - id.i=i;//這個(gè)i有了根
 - id.onclick=function(){
 - alert(this.i)
 - };
 - };1.for(var i=1; i < 4; i++){
 - var id = document.getElementById("a" + i);
 - window[id.id]=i;//這個(gè)i有了根
 - id.onclick=function(){
 - alert(window[this.id]);
 - };
 - }
 
產(chǎn)生一對(duì)一的更多Javascript閉包
- for(var i=1; i < 4; i++){
 - var id = document.getElementById("a" + i);
 - id.onclick = new function(){
 - var i2=i;//這個(gè)i是閉包的閉包
 - return function(){
 - alert(i2);
 - }
 - };
 - }
 
【編輯推薦】















 
 
 



 
 
 
 