資源描述:
《淺析Javascript閉包的特性》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、淺析Javascript閉包的特性Javascript閉包的定義非?;逎]包,是指語法域位于某個特定的區(qū)域,具有持續(xù)參照(讀寫)位于該區(qū)域內(nèi)自身范圍之外的執(zhí)行域上的非持久型變量值能力的段落。這些外部執(zhí)行域的非持久型變量神奇地保留它們在閉包最初定義(或創(chuàng)建)時的值(深連結(jié))。簡單來說,Javascript閉包就是在另一個作用域中保存了一份它從上一級函數(shù)或作用域取得的變量(鍵值對),而這些鍵值對是不會隨上一級函數(shù)的執(zhí)行完成而銷毀。周愛民說得更清楚,閉包就是“屬性表”,閉包就是一個數(shù)據(jù)塊,閉包就是一個存放著“Name=Value”的對照表。就這么簡單。但是,必須強(qiáng)調(diào),閉包是運行期
2、概念,一個函數(shù)實例。Javascript閉包的實現(xiàn),通常是在函數(shù)內(nèi)部再定義函數(shù),讓該內(nèi)部函數(shù)使用上一級函數(shù)的變量或全局變量。ECMAScript認(rèn)為使用全局變量是一個簡單的Javascript閉包實例。1.var?sMessage?=?"Hello?World";??2.function?sayHelloWorld(){??3.alert(sMessage);??4.};??5.sayHelloWorld();?但它完成沒有體現(xiàn)Javascript閉包的特性……現(xiàn)在比較讓人認(rèn)同的Javascript閉包實現(xiàn)有如下三種6.with(obj){??7.//這里是對象閉包??8.}(
3、function(){?????9.//函數(shù)閉包??10.})()try{??11.//...??12.}?catch(e)?{??13.//catch閉包?但I(xiàn)E里不行??14.}?附上今天在無憂看到的問題:要求:讓這三個節(jié)點的Onclick事件都能正確的彈出相應(yīng)的參數(shù)。1.
??6.?客服果果的解答:20.for(var?i=1;?i?4;?i++){?????21
5、.var?id?=?document.getElementById("a"?+?i);????22./*????23.這里生成了一個匿名函數(shù)并賦值給對象?id_i;????24.*/????25.id.onclick?=?function(){?????????26./*?????????27.這個i來源于局部變量,無法以window.i或者obj.i的形式在后期引用,?????????28.只好以指針或者變量地址方式保存在這個匿名函數(shù)中,?????????29.這就是傳說的閉包,所以所有這個過程中生成的事件句柄都使用引用?????????30.的方式來持久這個變量,也就是這些
6、匿名函數(shù)共用一個變量i;?????????31.*/????????32.alert(i);?????33.};??34.};?局部變?nèi)?.for(var?i=1;?i?4;?i++){??2.var?id?=?document.getElementById("a"?+?i);????3.id.i=i;//這個i有了根????4.id.onclick=function(){?????????5.alert(this.i)?????6.};??7.};1.for(var?i=1;?i?4;?i++){????8.var?id?=?document.getElementB
7、yId("a"?+?i);???9.window[id.id]=i;//這個i有了根???10.id.onclick=function(){????????11.alert(window[this.id]);????12.};??13.}?產(chǎn)生一對一的更多Javascript閉包14.for(var?i=1;?i?4;?i++){???15.var?id?=?document.getElementById("a"?+?i);???16.id.onclick?=?new?function(