js中閉包的概念
閉包並不是 JavaScript 特有的,大部分高階語言都具有這項能力。
什麼是閉包?
A closure is the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment).##這段是MDN 上對閉包的定義,理解為:一個函數及其周圍封閉詞法環境中的引用構成閉包。可能這句話還是不好理解,看看範例:
function createAction() { var message = "封闭环境内的变量"; return function() { console.log(message); } } const showMessage = createAction(); showMessage(); // output: 封闭环境内的变量
- showMessage
是
createAction執行後從中傳回出來的一個
函數。 - createAction
內部是一個封閉的詞法環境,
message作為該封裝環境內的變量,在外面是絕不可能直接存取。
- showMessage
在
createAction外部執行,但執行時卻存取到其內部定義的局部變數
message(成功輸出)。這是因為
showMessage引用的函數(
createAction內部的匿名函數),在定義時,綁定了其所處詞法環境(
createAction內部)中的引用(
message等)。
綁定了內部語法環境的匿名函數被 - return
帶到了
createAction封閉環境之外使用,這才能形成閉包。如果是在
createAction內部調用,不算是閉包。
不要認為是「你」創建了閉包,因為閉包是語言特性,你只是利用了這個特性。
如果語言不支援閉包,類似上面的程式碼,執行showMessage 時,就會找不到
message 變數。我特別想去找一個例子,但是很不幸,我所知道的高階語言,只要能在函數/方法內定義函數的,似乎都支援閉包。
return 把局部定義的函數帶出去,除此之外有沒有別的辦法?
function encase(aCase) { const dog = "狗狗"; const cat = "猫猫"; aCase.show = function () { console.log(dog, cat); }; } const myCase = {}; encase(myCase); myCase.show(); // output: 猫猫 狗狗
exports.something 逐一帶貨,也可以透過
module.exports = ... 打包帶貨,但不管怎麼樣,
exports 就是帶貨的那一個,只是它有可能是原來安排的
exports 也可能是被換成了自己人的
exports。
import 和
export 語法,也只不過是換種方法帶貨出去而已,和
return 帶貨差不多,差別只在於
return 只能帶一個(除非打包),
export 可以帶一堆。
const var1 = "我是一个顶层变量吧"; function maybeATopFunction() { }
// module factory function createModule_18abk2(exports, module) { const var1 = "我是一个顶层变量吧"; function maybeATopFunction() { } } // ... 遥远的生产线上,有这样的示意代码 const module = { exports: {} }; const m18abk2 = createModule_18abk2(module) ?? module; // 想明白 createModule_18abk2 为什么会有一个随机后缀没?
function create() { function closure() { } return closure; } const a = create(); const b = create(); console.log(a === b); // false
closure() 換個方式定義看會不會好理解一點:
function create() { closure = function() { } return closure; }
function create() { const a = function () { }; const b = function () { }; console.log(a === b); // false }
function 都定義了一個新的函數。函數是新的,名字不重要 —— 你能叫小明,別人也能叫小明不是。
閉包是由一個函數以及其定義時所在封閉環境內的各種資源(引用)構成,得到的每一個閉包都是獨一無二的,因為構成閉包的環境資源不同(不同的局部環境,定義了不同的局部變量,傳入了不同的參數等)。 閉包,這回搞明白了!
推薦教學:《
JS教學》
以上是js中閉包的概念的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

在C++中,閉包是能夠存取外部變數的lambda表達式。若要建立閉包,請擷取lambda表達式中的外部變數。閉包提供可重複使用性、資訊隱藏和延遲求值等優點。它們在事件處理程序等實際情況中很有用,其中即使外部變數被銷毀,閉包仍然可以存取它們。

C++Lambda表達式支援閉包,即保存函數作用域變數並供函數存取。語法為[capture-list](parameters)->return-type{function-body}。 capture-list定義要捕獲的變量,可以使用[=]按值捕獲所有局部變量,[&]按引用捕獲所有局部變量,或[variable1,variable2,...]捕獲特定變量。 Lambda表達式只能存取捕獲的變量,但無法修改原始值。

閉包是一種巢狀函數,它能存取外層函數作用域的變量,優點包括資料封裝、狀態保持和靈活性。缺點包括記憶體消耗、效能影響和調試複雜性。此外,閉包還可以建立匿名函數,並將其作為回調或參數傳遞給其他函數。

標題:閉包造成的記憶體洩漏及解決方法引言:閉包是JavaScript中一個非常常見的概念,它可以讓內部函數存取外部函數的變數。然而,閉包在使用不當的情況下可能導致記憶體洩漏。本文將探討閉包所造成的記憶體洩漏問題,並提供解決方法及具體程式碼範例。一、閉包引起的記憶體洩漏問題閉包的特性是內部函數可以存取外部函數的變量,這意味著在閉包中引用的變數不會被垃圾回收。如果使用不當,

函數指針和閉包對Go性能的影響如下:函數指針:稍慢於直接調用,但可提高可讀性和可復用性。閉包:通常更慢,但可封裝資料和行為。實戰案例:函數指標可最佳化排序演算法,閉包可建立事件處理程序,但會帶來效能損失。

是的,可以透過鍊式呼叫和閉包優化程式碼簡潔性和可讀性:鍊式呼叫可將函數呼叫連結為一個流暢介面。閉包可建立可重複使用程式碼區塊,並在函數外部存取變數。

Java中的閉包允許內部函數存取外部的作用域變量,即使外部函數已經退出。透過匿名內部類別實現,內部類別持有一個外部類別的引用,使外部變數保持活動。閉包增強了程式碼靈活性,但需要注意記憶體洩漏風險,因為匿名內部類別對外部變數的參考會保持這些變數的活動狀態。

Go語言函數閉包在單元測試中發揮著至關重要的作用:捕獲值:閉包可以存取外部作用域的變量,允許在巢狀函數中捕獲和重複使用測試參數。簡化測試程式碼:透過擷取值,閉包消除了對每個循環重複設定參數的需求,從而簡化了測試程式碼。提高可讀性:使用閉包可以組織測試邏輯,使測試程式碼更清晰、更易於閱讀。
