簡短幾句 通俗解釋javascript的閉包
更新時間:2011年01月17日 22:37:15 作者:
什么是閉包呢?閉包就是函數(shù)實例執(zhí)行過程中動態(tài)產(chǎn)生一個沒有被釋放資源的棧區(qū),也是一個預執(zhí)行的過程。
何謂沒有被釋放資源的棧區(qū)和預執(zhí)行的過程,用一個最常見的示例來解釋:
比方現(xiàn)在我們有一個ul,下面有很多個li,需要遍歷他們?yōu)樗麄兘壎▎螕羰录?,并在點擊后將當前下標傳遞給另外一個function來進行額外的處理:
for(var i=0; i<agroup.length; i++) {
agroup[i].onclick = function() {
handler(i);
}
}
執(zhí)行結(jié)果顯而易見對吧?在handler中,獲取傳遞過去的參數(shù)i,你看到的將全部是最大的下標,這個時候,我們通常用下面的辦法解決:
for(var i=0; i<agroup.length; i++) {
agroup[i].i = i
agroup[i].onclick = function() {
handler(this.i);
}
}
那么在這里,先講一下this的指向問題,從通常來說,javascript中的this是指向當前引用他的對象的。上面我們相當為this新增了一個為i的屬性,他的值就是當前的下標值。
那么用閉包的方式如何解決這個問題?其實原理相同,我們需要預先的把i值保存起來,或叫作傳遞:
for(var i=0; i<agroup.length; i++) {
agroup[i].onclick = function(index) {
return function() {
handler(index);
}
}(i);
}
這個時候你會得到正確的下標,這樣做與增加i屬性有何雷同之處?也就是他們都預先把下標i值傳遞或是儲存起來。在上面的演示中,預執(zhí)行onclick所引用的函數(shù),而這個
函數(shù)當中返回了一個內(nèi)嵌函數(shù),形成一個沒有被釋放資源的棧區(qū),并在預執(zhí)行的時候?qū)值以參數(shù)的形式傳入這個作用域(解釋能力有問題,這句解釋不知道是否準確,歡迎磚拍)。
綜上所述,閉包的作用通常是改變作用域或預執(zhí)行。應該看官很明白了,上面?zhèn)€出的示例很局限,閉包的應用范圍是很廣的,了解其因果,才能靈活的使用它。
auntion 2011-11-15
mail Auntion@gmail.com
QQ 82874972
原創(chuàng)文章,請尊重打字的辛勞和作者的權(quán)益,轉(zhuǎn)載時請不要刪除這里的作者信息。
比方現(xiàn)在我們有一個ul,下面有很多個li,需要遍歷他們?yōu)樗麄兘壎▎螕羰录?,并在點擊后將當前下標傳遞給另外一個function來進行額外的處理:
復制代碼 代碼如下:
for(var i=0; i<agroup.length; i++) {
agroup[i].onclick = function() {
handler(i);
}
}
執(zhí)行結(jié)果顯而易見對吧?在handler中,獲取傳遞過去的參數(shù)i,你看到的將全部是最大的下標,這個時候,我們通常用下面的辦法解決:
復制代碼 代碼如下:
for(var i=0; i<agroup.length; i++) {
agroup[i].i = i
agroup[i].onclick = function() {
handler(this.i);
}
}
那么在這里,先講一下this的指向問題,從通常來說,javascript中的this是指向當前引用他的對象的。上面我們相當為this新增了一個為i的屬性,他的值就是當前的下標值。
那么用閉包的方式如何解決這個問題?其實原理相同,我們需要預先的把i值保存起來,或叫作傳遞:
復制代碼 代碼如下:
for(var i=0; i<agroup.length; i++) {
agroup[i].onclick = function(index) {
return function() {
handler(index);
}
}(i);
}
這個時候你會得到正確的下標,這樣做與增加i屬性有何雷同之處?也就是他們都預先把下標i值傳遞或是儲存起來。在上面的演示中,預執(zhí)行onclick所引用的函數(shù),而這個
函數(shù)當中返回了一個內(nèi)嵌函數(shù),形成一個沒有被釋放資源的棧區(qū),并在預執(zhí)行的時候?qū)值以參數(shù)的形式傳入這個作用域(解釋能力有問題,這句解釋不知道是否準確,歡迎磚拍)。
綜上所述,閉包的作用通常是改變作用域或預執(zhí)行。應該看官很明白了,上面?zhèn)€出的示例很局限,閉包的應用范圍是很廣的,了解其因果,才能靈活的使用它。
auntion 2011-11-15
mail Auntion@gmail.com
QQ 82874972
原創(chuàng)文章,請尊重打字的辛勞和作者的權(quán)益,轉(zhuǎn)載時請不要刪除這里的作者信息。
相關(guān)文章
BootStrap selectpicker后臺動態(tài)綁定數(shù)據(jù)的方法
這篇文章主要為大家詳細介紹了BootStrap selectpicker后臺動態(tài)綁定數(shù)據(jù)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07用js實現(xiàn)的十進制的顏色值轉(zhuǎn)換成十六進制的代碼
用js實現(xiàn)的十進制的顏色值轉(zhuǎn)換成十六進制的代碼...2007-03-03元素的內(nèi)聯(lián)事件處理函數(shù)的特殊作用域在各瀏覽器中存在差異
在一個元素的屬性中綁定事件,實際上就創(chuàng)建了一個內(nèi)聯(lián)事件處理函數(shù)(如<h1 onclick="alert(this);"...>...</h1>),內(nèi)聯(lián)事件處理函數(shù)有其特殊的作用域鏈,并且各瀏覽器的實現(xiàn)細節(jié)也有差異。2011-01-01JS+CSS實現(xiàn)六級網(wǎng)站導航主菜單效果
這篇文章主要介紹了JS+CSS實現(xiàn)六級網(wǎng)站導航主菜單效果,涉及JavaScript遍歷頁面元素及動態(tài)修改css屬性的相關(guān)實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09Bootstrap告警框(alert)實現(xiàn)彈出效果和短暫顯示后上浮消失的示例代碼
這篇文章主要介紹了Bootstrap告警框(alert)實現(xiàn)彈出效果和短暫顯示后上浮消失,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08js實現(xiàn)QQ面板拖拽效果(慕課網(wǎng)DOM事件探秘)(全)
這篇文章主要為大家詳細介紹了QQ面板拖拽效果,探秘慕課網(wǎng)DOM事件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09JavaScript實現(xiàn)文件下載并重命名代碼實例
這篇文章主要介紹了JavaScript實現(xiàn)文件下載并重命名代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12