摘要:什么是閉包定義我所理解的閉包就是,即使外部函數已經運行完畢,內部函數仍能訪問外部函數的作用域中的變量。閉包的應用場景私有變量模塊需求只能通過函數提供的方法訪問函數內部的變量隱藏。為什么閉包很重要參考資料征服面試什么是閉包
1. 什么是閉包
MDN定義:Closures are functions that refer to independent (free) variables (variables that are used locally, but defined in an enclosing scope). In other words, these functions "remember" the environment in which they were created.
You Don"t Know JS: Closure is when a function is able to remember and access its lexical scope even when that function is executing outside its lexical scope.
我所理解的閉包就是,即使外部函數已經運行完畢,內部函數仍能訪問外部函數的作用域中的變量。 抓重點: 函數, 作用域。2. 閉包的運行機制 2.1 詞法作用域查找規則
在閉包的使用中,為什么我們能夠通過閉包訪問外部函數的作用域中的變量?其一,詞法作用域的查找規則是“冒泡”的,即向外層一層層查找,直到全局作用域,所以能夠訪問外部函數的作用域。其二,函數的作用域是定義時所在的作用域,而不是運行時的作用域。
function foo() { var a = 1; function bar() { console.log(a); } return bar; } var a = 2; var baz = foo(); baz(); //1
在上面的代碼中,由于bar定義在foo的內部,因此能夠向外“冒泡”訪問foo的作用域。當運行baz時,a的值為1而不是2,也說明了函數的作用域是定義時的作用域,是靜態的。
2.2 垃圾回收 + 引用當函數執行完畢后,引擎的垃圾回收機制會釋放不再使用的內存空間。因此,當外部函數執行完畢時,外部函數的內部作用域理應是該被銷毀的。然而,由于閉包存在對外部函數作用域的引用,因此此作用域仍然存在,所以內部函數仍能在外部函數執行結束之后訪問外部函數定義的變量,此之為“記住”。
3. 閉包的應用場景 3.1 私有變量 + 模塊需求:只能通過函數提供的方法訪問函數內部的變量——隱藏。只能內部訪問——私有。
function bookInfo() { var book = { name: "You Don"t know JS", price: 66 }; function getPrice() { console.log(book.price); }; function getName() { console.log(book.name); }; function setPrice(price) { book.price = price; }; return { getPrice, getName, setPrice }; }; var book = bookInfo(); book.getPrice(); //66 book.getName(); //"You Don"t know JS" book.setPrice(100); book.getPrice(); //100
在以上的代碼中,bookInfo通過返回一個對象,該對象的值是對內部函數的引用,而不是對變量的引用。因此,實現了函數內部變量是隱藏的(只能通過返回的對象方法訪問)且私有的(只有函數內部才能訪問)。
在模塊中,返回的變量就被稱為模塊的公共API,模塊內部的變量只能通過這些方法去使用。
3.2 偏函數應用需求:函數需要先接受一些參數,隨后再接受另一些參數的時候。
比如,當我計算商品的總價格時,我想先設定商品的單價,隨后根據購買數量算出總的商品價格。
function partialApply(fn, ...fixedArgs) { return function (...remainingArgs) { return fn.apply(this, fixedArgs.concat(remainingArgs)); } } function calTotalPrices(price, count) { console.log(price * count); } var pay = partialApply(calPrice, 10); pay(5);
在上面的代碼中,pay就是在partialApply的外部訪問了partialApply的內部變量(函數參數)。
4. 為什么閉包很重要? 參考資料征服 JavaScript 面試:什么是閉包?| Eric Elliott
You Don"t know JavaScript
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/81448.html
摘要:一前言這個周末,注意力都在學習基礎知識上面,剛好看到了閉包這個神圣的東西,所以打算把這兩天學到的總結下來,算是鞏固自己所學。因此要注意閉包的使用,否則會導致性能問題。五總結閉包的作用能夠讀取其他函數內部變量。 # 一、前言 這個周末,注意力都在學習基礎Js知識上面,剛好看到了閉包這個神圣的東西,所以打算把這兩天學到的總結下來,算是鞏固自己所學。也可能有些不正確的地方,也請大家看到了,麻...
摘要:遞歸閉包模仿塊級作用域私有變量小結在編程中,使用函數表達式可以無需對函數命名,從而實現動態編程。匿名函數也稱為拉姆達函數。函數聲明要求有名字,但函數表達式不需要。中的函數表達式和閉包都是極其有用的特性,利用它們可以實現很多功能。 1、遞歸 2、閉包 3、模仿塊級作用域 4、私有變量 5、小結 在JavaScript編程中,使用函數表達式可以無需對函數命名,從而實現動態編程。匿名函數也稱...
摘要:但是,必須強調,閉包是一個運行期概念。通過原型鏈可以實現繼承,而與閉包相關的就是作用域鏈。常理來說,一個函數執行完畢,其執行環境的作用域鏈會被銷毀。所以此時,的作用域鏈雖然銷毀了,但是其活動對象仍在內存中。 學習Javascript閉包(Closure)javascript的閉包JavaScript 閉包深入理解(closure)理解 Javascript 的閉包JavaScript ...
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。異步編程入門的全稱是前端經典面試題從輸入到頁面加載發生了什么這是一篇開發的科普類文章,涉及到優化等多個方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結思考,循序漸進的理解 TypeScript。 網絡基礎知識之 HTTP 協議 詳細介紹 HTT...
閱讀 3048·2023-04-25 20:09
閱讀 3323·2021-11-23 09:51
閱讀 1977·2021-11-22 15:25
閱讀 3356·2021-11-18 10:02
閱讀 2759·2021-09-27 13:56
閱讀 1312·2019-08-30 15:44
閱讀 1156·2019-08-30 13:21
閱讀 3329·2019-08-30 11:05