溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javascript中什么指的是閉包

發布時間:2021-11-24 14:10:36 來源:億速云 閱讀:167 作者:小新 欄目:web開發

這篇文章主要為大家展示了“javascript中什么指的是閉包”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“javascript中什么指的是閉包”這篇文章吧。

在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。

閉包的價值是方便在表達式運算過程中存儲數據。但是,它的缺點也不容忽視:

  • 由于函數調用后,無法注銷調用對象,會占用系統資源,在腳本中大量使用閉包,容易導致內存泄漏。解決方法:慎用閉包,不要濫用。

  • 由于閉包的作用,其保存的值是動態,如果處理不當容易出現異?;蝈e誤。

以上是“javascript中什么指的是閉包”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女