重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
這篇文章主要為大家展示了“javascript中什么指的是閉包”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“javascript中什么指的是閉包”這篇文章吧。
我們提供的服務有:做網站、成都網站制作、微信公眾號開發、網站優化、網站認證、珙縣ssl等。為上千余家企事業單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的珙縣網站制作公司
在javascript中,閉包指的就是一個函數;當兩個函數彼此嵌套時,內部的函數就是閉包。典型的閉包體是一個嵌套結構的函數;內部函數引用外部函數的私有成員,同時內部函數又被外界引用,當外部函數被調用后,就形成了閉包。
本教程操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。
什么是閉包
所謂閉包,指的就是一個函數。當兩個函數彼此嵌套時,內部的函數就是閉包。
形成原理
函數被調用時,會產生一個臨時上下文活動對象。它是函數作用域的頂級對象,作用域內所有私有方法有變量、參數、私有函數等都將作為上下文活動對象的屬性而存在。
函數被調用后,在默認情況下上下文活動對象會被立即釋放,避免占用系統資源。但是,若函數內的私有變量、參數、私有函數等被外界引用,則這個上下文活動對象暫時會繼續存在,直到所有外界引用被注銷。
但是,函數作用域是封閉的,外界無法訪問。那么在什么情況下,外界可以訪問到函數內的私有成員呢?
根據作用域鏈,內部函數可以訪問外部函數的私有成員。如果內部函數引用了外部函數的私有成員,同時內部函數又被傳給外界,或者對外界開放,那么閉包體就形成了。這個外部函數就是一個閉包體,它被調用后,活動對象暫時不會被注銷,其屬性會繼續存在,通過內部函數可以持續讀寫外部函數的私有成員。
閉包結構
典型的閉包體是一個嵌套結構的函數。內部函數引用外部函數的私有成員,同時內部函數又被外界引用,當外部函數被調用后,就形成了閉包。這個函數也稱為閉包函數。
下面是一個典型的閉包結構。
function f(x) { //外部函數 return function (y) { //內部函數,通過返回內部函數,實現外部引用 return x + y; //訪問外部函數的參數 }; } var c = f(5); //調用外部函數,獲取引用內部函數 console.log(c(6)); //調用內部函數,原外部函數的參數繼續存在
解析過程簡單描述如下:
在 JavaScript 腳本預編譯期,聲明的函數 f 和變量 c,先被詞法預解析。
在 JavaScript 執行期,調用函數 f,并傳入值 5。
在解析函數 f 時,將創建執行環境(函數作用域)和活動對象,并把參數和私有變量、內部函數都映射為活動對象的屬性。
參數 x 的值為 5,映射到活動對象的 x 屬性。
內部函數通過作用域鏈引用了參數 x,但是還沒有被執行。
外部函數被調用后,返回內部函數,導致內部函數被外界變量 c 引用。
JavaScript 解析器檢測到外部函數的活動對象的屬性被外界引用,無法注銷該活動對象,于是在內存中繼續維持該對象的存在。
當調用 c,即調用內部函數時,可以看到外部函數的參數 x 存儲的值繼續存在。這樣就可以實現后續運算操作,返回 x+y=5=6=11。
閉包的價值是方便在表達式運算過程中存儲數據。但是,它的缺點也不容忽視:
由于函數調用后,無法注銷調用對象,會占用系統資源,在腳本中大量使用閉包,容易導致內存泄漏。解決方法:慎用閉包,不要濫用。
由于閉包的作用,其保存的值是動態,如果處理不當容易出現異常或錯誤。
以上是“javascript中什么指的是閉包”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創新互聯行業資訊頻道!