這篇文章將為大家詳細(xì)講解有關(guān)怎么在JavaScript中使用閉包,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
10年積累的網(wǎng)站設(shè)計、網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計制作后付款的網(wǎng)站建設(shè)流程,更有碧江免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
1、能夠嵌入動態(tài)文本于HTML頁面。2、對瀏覽器事件做出響應(yīng)。3、讀寫HTML元素。4、在數(shù)據(jù)被提交到服務(wù)器之前驗(yàn)證數(shù)據(jù)。5、檢測訪客的瀏覽器信息。6、控制cookies,包括創(chuàng)建和修改等。7、基于Node.js技術(shù)進(jìn)行服務(wù)器端編程。
理解閉包關(guān)鍵是理解JS的對象的本質(zhì)以及垃圾收集機(jī)制。函數(shù)也是對象,也有屬性,通常執(zhí)行一個函數(shù)時,局部變量在函數(shù)執(zhí)行完后,內(nèi)存會被回收,這是JS的垃圾收集機(jī)制決定的,如果想保存局部變量所占用的內(nèi)存,就必須把保存在另一個不被回收的變量中,通常是全局變量。函數(shù)在創(chuàng)建時,內(nèi)部屬性[[Scope]]
保存了作用域鏈,作用域鏈中包含外部函數(shù)以及全局對象的變量,被稱為變量對象。所以把內(nèi)部函數(shù)返回時,由于把函數(shù)保存了,所以內(nèi)部屬性[[Scope]]
所保存的變量對象也就保存了而沒有被回收,因此局部變量也就被保存了。
最簡單的閉包:
function f1() { var i = 0; return function () { var j = 0; i++; console.log(i,j); }; } var fn = f1(); fn();//1 0 fn();//2 0
還有諸如給元素添加事件,事件函數(shù)保存著外部函數(shù)的變量,通過這個特性可以讓按鈕顯示被點(diǎn)擊次數(shù)。
當(dāng)然可以創(chuàng)建多層閉包,最內(nèi)部函數(shù)保存所有外部函數(shù)以及全局對象的變量,但并不是任何地方都用閉包,因?yàn)槠涫冀K都帶有[[Scope]]
屬性,所有比較占內(nèi)存,所以在需要的時候才用。
閉包在模塊化編程,為函數(shù)或?qū)ο髣?chuàng)建私有變量的時候非常有用,可以避免全局污染以及變量命名沖突的問題。
值得注意的是因?yàn)?/strong>[[Scope]]
與函數(shù)有關(guān),如上述例子,在兩次執(zhí)行f1函數(shù)把返回的函數(shù)保存在不同的變量中,其外部函數(shù)的變量是互不影響的。如:
function f1() { var i = 0; return function () { var j = 0; i++; console.log(i,j); }; } var fn = f1(); fn();//1 0 fn();//2 0 var fn1 = f1(); fn1();//1 0 fn(); //3 0 fn1();//2 0
關(guān)于怎么在JavaScript中使用閉包就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。