摘要:閉包的含義和作用根據作用鏈,只能在內部訪問到外部函數,通過閉包外部也可以訪問內部變量。有垃圾清理機制,當一個對象使用后會自動清理,閉包可以使變量一直保存在內存中不會被清理。
閉包的含義和作用
1、根據JavaScript作用鏈,只能在內部訪問到外部函數,通過閉包外部也可以訪問內部變量。
2、js有垃圾清理機制,當一個對象使用后會自動清理,閉包可以使變量一直保存在內存中不會被清理。
正常情況下的訪問 inner內部函數可以訪問到變量a,但是outer訪問不到inner的變量b
`
function outer (){
let a = 1; function inner(){ let b = 2; console.log(a); //1 }
}
`
使用閉包可以當函數執行完后變量仍然保持,將c保存到返回的inner1函數里,當outer1執行完后,c并不會被銷毀而是返回到inner函數中。
調用outer1()后,返回了inner1賦值給closure。再執行closure可以即從外部獲得變量c
function outer1(){ let c = 99; //將變量返回到內部函數中 return function inner1(){ return c; } } let closure = outer1(); let c1 = closure() // 99用閉包來解決在循環中遇到的相關問題
當給多個元素綁定點擊事件時使用循環遍歷綁定的方法,點擊綁定事件是異步回調的方法,所以會等到循環結束后才將i返回,以下會導致的問題就是無論點擊哪個元素都只會打印3
div0div1div2
使用閉包,封裝成一個獨立的立即執行的匿名函數,將每次循環的i作為參數傳進去,這樣就可以在執行的時候取到當前i的值而不是循環結束后的值,分別點擊div都是打印的是0,1,2
for(var i=0;i<3;i++){ (function(n){ var div = document.getElementById("div"+n).addEventListener("click",function(){ console.log(n) }) })(i) }
同理setTimeout也是異步回調,如果沒有使用閉包將它包裹會打印三次3
function(){ for(var i=0;i<3;i++){ setTimeout(()=>{ console.log(i) },0) } }
使用閉包后分別打印出0,1,2,3,4,5
for(let n=0;n<6;n++){ (function(m){ setTimeout(()=>{ console.log(m) },0) })(n) }注意事項
使用閉包會導致內存外泄,因為當函數執行完后里面的變量并沒有被垃圾清除機制清理,過多使用閉包會影響性能。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/98071.html
摘要:也許最好的理解是閉包總是在進入某個函數的時候被創建,而局部變量是被加入到這個閉包中。在函數內部的函數的內部聲明函數是可以的可以獲得不止一個層級的閉包。 前言 總括 :這篇文章使用有效的javascript代碼向程序員們解釋了閉包,大牛和功能型程序員請自行忽略。 譯者 :文章寫在2006年,可直到翻譯的21小時之前作者還在完善這篇文章,在Stackoverflow的How do Java...
摘要:但是閉包也不是什么復雜到不可理解的東西,簡而言之,閉包就是閉包就是函數的局部變量集合,只是這些局部變量在函數返回后會繼續存在。可惜的是,并沒有提供相關的成員和方法來訪問閉包中的局部變量。 (收藏自 技術狂) 前言:還是一篇入門文章。Javascript中有幾個非常重要的語言特性——對象、原型繼承、閉包。其中閉包 對于那些使用傳統靜態語言C/C++的程序員來說是一個新的語言特性。本文將...
摘要:當在中調用匿名函數時,它們用的都是同一個閉包,而且在這個閉包中使用了和的當前值的值為因為循環已經結束,的值為。最好將閉包當作是一個函數的入口創建的,而局部變量是被添加進這個閉包的。 閉包不是魔法 這篇文章使用一些簡單的代碼例子來解釋JavaScript閉包的概念,即使新手也可以輕松參透閉包的含義。 其實只要理解了核心概念,閉包并不是那么的難于理解。但是,網上充斥了太多學術性的文章,對于...
摘要:深入系列第八篇,介紹理論上的閉包和實踐上的閉包,以及從作用域鏈的角度解析經典的閉包題。定義對閉包的定義為閉包是指那些能夠訪問自由變量的函數。 JavaScript深入系列第八篇,介紹理論上的閉包和實踐上的閉包,以及從作用域鏈的角度解析經典的閉包題。 定義 MDN 對閉包的定義為: 閉包是指那些能夠訪問自由變量的函數。 那什么是自由變量呢? 自由變量是指在函數中使用的,但既不是函數參數也...
摘要:一言以蔽之,閉包,你就得掌握。當函數記住并訪問所在的詞法作用域,閉包就產生了。所以閉包才會得以實現。從技術上講,這就是閉包。執行后,他的內部作用域并不會消失,函數依然保持有作用域的閉包。 網上總結閉包的文章已經爛大街了,不敢說筆者這篇文章多么多么xxx,只是個人理解總結。各位看官瞅瞅就好,大神還希望多多指正。此篇文章總結與《JavaScript忍者秘籍》 《你不知道的JavaScri...
摘要:但是,必須強調,閉包是一個運行期概念。通過原型鏈可以實現繼承,而與閉包相關的就是作用域鏈。常理來說,一個函數執行完畢,其執行環境的作用域鏈會被銷毀。所以此時,的作用域鏈雖然銷毀了,但是其活動對象仍在內存中。 學習Javascript閉包(Closure)javascript的閉包JavaScript 閉包深入理解(closure)理解 Javascript 的閉包JavaScript ...
閱讀 1412·2023-04-26 01:58
閱讀 2289·2021-11-04 16:04
閱讀 1776·2021-08-31 09:42
閱讀 1768·2021-07-25 21:37
閱讀 1069·2019-08-30 15:54
閱讀 2078·2019-08-30 15:53
閱讀 3055·2019-08-29 13:28
閱讀 2693·2019-08-29 10:56