【JS 田井中律】掌握 JavaScript 閉包和記憶化

JavaScript Closures and Memoization
閉包

JavaScript 閉包是現(xiàn)代 Web 開發(fā)中廣泛使用的一個重要概念。簡單來說,閉包允許函數(shù)記住和訪問它的詞法環(huán)境(?lexical environment),即使該函數(shù)是在其原始范圍之外執(zhí)行的。這個概念起初聽起來可能很復(fù)雜,但它是創(chuàng)建模塊化、高效和安全代碼的基本工具。在這篇文章中,我們將深入探討閉包并提供其用法的真實(shí)示例。
What?Why?什么是閉包
閉包 -->?函數(shù)
閉包是一個函數(shù),可以訪問其外部(封閉)詞法環(huán)境中的變量。換句話說,它可以訪問其父函數(shù)中定義的變量和參數(shù),即使該函數(shù)已完成執(zhí)行。這之所以成為可能,是因?yàn)?JavaScript 處理范圍的方式。
在 JavaScript 中,每個函數(shù)都會創(chuàng)建一個新的詞法作用域(lexical scope)。這意味著在函數(shù)內(nèi)聲明的任何變量只能在該函數(shù)的范圍內(nèi)訪問。但是,當(dāng)一個函數(shù)定義在另一個函數(shù)內(nèi)部時,內(nèi)部函數(shù)可以訪問外部函數(shù)的作用域,包括其中定義的任何變量或參數(shù)。這就是使閉包成為可能的原因。
How?閉包示例
讓我們看一個簡單的閉包示例。在此示例中,我們有一個名為?outerFunction
?的函數(shù),它定義了一個名為?outerVariable
?的變量。該函數(shù)還返回另一個函數(shù),我們稱之為?innerFunction
?。?innerFunction
?可以訪問?outerVariable
?,即使它是在其自身范圍之外定義的。
在此示例中,我們調(diào)用?outerFunction
?并將結(jié)果分配給名為?closure
?的變量。?closure
?現(xiàn)在是可以訪問?outerVariable
?的函數(shù),即使?outerFunction
?已完成執(zhí)行。當(dāng)我們調(diào)用?closure()
?時,它會記錄“Hello, world!”到控制臺。
When?Where?閉包的真實(shí)場景
出于各種原因,閉包在現(xiàn)代 Web 開發(fā)中被廣泛使用。以下是閉包可能有用的一些真實(shí)場景:
1)創(chuàng)建私有變量和方法??Private Variables and Methods
閉包可用于創(chuàng)建私有變量和方法。在 JavaScript 中,沒有內(nèi)置的方法來創(chuàng)建私有變量和方法。但是,通過使用閉包,我們可以創(chuàng)建只能在特定函數(shù)范圍內(nèi)訪問的變量和方法。
讓我們看一個例子:(是不是想到了ReactJS?的自定義鉤子)
在上面的示例中,我們有一個名為?counter
?的函數(shù),它創(chuàng)建了三個內(nèi)部函數(shù):?increment
?、?decrement
?和?getCount
?。這些內(nèi)部函數(shù)可以訪問在?counter
?范圍內(nèi)定義的?count
?變量,并且它們可以根據(jù)需要修改或返回它。結(jié)果是一個具有私有變量和方法的“計數(shù)器”對象。
2)事件處理程序?Event Handlers
閉包可用于創(chuàng)建可以訪問特定數(shù)據(jù)的事件處理程序。這在處理異步代碼時特別有用,在異步代碼中變量可能會發(fā)生不可預(yù)測的變化。
這是一個例子:
jiy3)記憶化?Memoization?
記憶化是一種用于通過緩存昂貴函數(shù)調(diào)用的結(jié)果并在相同輸入再次出現(xiàn)時返回緩存結(jié)果來優(yōu)化函數(shù)性能的技術(shù)。
下面是一個使用閉包的記憶示例:
在這個例子中,我們有一個名為?memoize
?的函數(shù),它接受函數(shù)?func
?作為參數(shù)。?memoize
?返回一個可以訪問?cache
?對象的新函數(shù)。當(dāng)使用某些參數(shù)調(diào)用記憶函數(shù)時,它會檢查結(jié)果是否已被緩存。如果有,則返回緩存的結(jié)果。如果沒有,它將使用提供的參數(shù)調(diào)用原始函數(shù),緩存結(jié)果并返回它。
小結(jié)
閉包是在 JavaScript 中創(chuàng)建模塊化、高效和安全代碼的基本工具。它們允許函數(shù)記住和訪問它們的詞法環(huán)境,即使它們是在它們的原始范圍之外執(zhí)行的。閉包可用于多種用途,包括創(chuàng)建私有變量和方法、創(chuàng)建事件處理程序和緩存。通過了解閉包以及如何有效地使用它們,開發(fā)人員可以編寫出更好、更高效、更易于維護(hù)和調(diào)試的代碼。