摘要:一前言這個周末,注意力都在學習基礎知識上面,剛好看到了閉包這個神圣的東西,所以打算把這兩天學到的總結下來,算是鞏固自己所學。因此要注意閉包的使用,否則會導致性能問題。五總結閉包的作用能夠讀取其他函數內部變量。
# 一、前言
這個周末,注意力都在學習基礎Js知識上面,剛好看到了閉包這個神圣的東西,所以打算把這兩天學到的總結下來,算是鞏固自己所學。也可能有些不正確的地方,也請大家看到了,麻煩在評論下提醒一下,算是互相學習了。
二、什么是閉包?百度百科定義:閉包就是能夠讀取其他函數內部變量的函數。
在解釋之前,得先講講作用域。先來看下面這個示例:
var a = 1; function f(){ var b = 2; console.log(a) // 1 } console.log(b) // undefined
示例中包含了兩種作用域,一種是屬于全局的全局作用域,另一種是屬于函數f的局部作用域。由于Javascript這種鏈式作用域(父作用域是可以被其子作用域訪問的,而子作用域卻不能被父作用域訪問)的機制,使得示例最后一行輸出了undefined
從此可以看出,無法從父作用域中訪問子作用域。而我們再來看閉包的定義:閉包就是能夠讀取其他函數內部變量的函數。也就是閉包可以讓我們從父作用域中訪問到子作用域,具體怎么實現的呢?來看這個經典的例子:
function foo(){ var a = 2; function bar(){ console.log(a); } return bar; } var baz = foo(); baz(); // 2 -> 這就是閉包的效果
這個示例中,閉包就是函數bar??梢钥吹?,我們通過在函數foo內部定義其子函數bar,并將其作為foo返回值,因為bar函數作用域可以訪問foo的作用域,所以實現了從全局作用域訪問foo函數作用域的效果。
三、閉包的應用其實,平時你所寫的代碼中,早就用到了閉包,只是你還沒發現而已。
本質上,無論何時何地,如果將函數當作值傳遞到其他地方使用(非函數所在作用域),你就已經使用了閉包。例如上面示例說的函數bar,我們將他傳遞到了全局作用域下,通過這種方式訪問到本該不能訪問的變量a。
在定時器、事件監聽器、Ajax請求、任何其他異步(或同步)任務中,只要使用了回調函數,實際上就是在使用閉包!
四、注意事項閉包會讓他所在作用域中的變量始終保存在內存中,而不會被垃圾回收機制回收。
function foo(p){ function bar(){ console.log(++p); } return bar; } var baz = foo(1); baz(); // 2 baz(); // 3 baz(); // 4 var bazz = foo(2); bazz(); // 3 bazz(); // 4 bazz(); // 5 baz(); // 5
看到了沒,閉包的使用,函數調用之后,讓其外層函數的內部變量(foo函數內的變量)始終保存在了內存中,而不會被回收。
值得注意的是,每次調用一次foo,都會生成一個新的閉包,都會在內存中保存下其外層函數的內部變量。因此要注意閉包的使用,否則會導致性能問題。
五、總結閉包的作用:
能夠讀取其他函數內部變量。
讓其他函數的內部變量始終保存在內存中。
參考:
阮一峰的Javascript入門教程——閉包
書籍:P43,你不知道的Javascript之閉包——上卷。
附:你不知道的Javascript系列電子書網盤鏈接, 密碼:i8jf
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97292.html
摘要:什么是閉包定義我所理解的閉包就是,即使外部函數已經運行完畢,內部函數仍能訪問外部函數的作用域中的變量。閉包的應用場景私有變量模塊需求只能通過函數提供的方法訪問函數內部的變量隱藏。為什么閉包很重要參考資料征服面試什么是閉包 1. 什么是閉包 MDN定義:Closures are functions that refer to independent (free) variables (v...
摘要:遞歸閉包模仿塊級作用域私有變量小結在編程中,使用函數表達式可以無需對函數命名,從而實現動態編程。匿名函數也稱為拉姆達函數。函數聲明要求有名字,但函數表達式不需要。中的函數表達式和閉包都是極其有用的特性,利用它們可以實現很多功能。 1、遞歸 2、閉包 3、模仿塊級作用域 4、私有變量 5、小結 在JavaScript編程中,使用函數表達式可以無需對函數命名,從而實現動態編程。匿名函數也稱...
摘要:但是,必須強調,閉包是一個運行期概念。通過原型鏈可以實現繼承,而與閉包相關的就是作用域鏈。常理來說,一個函數執行完畢,其執行環境的作用域鏈會被銷毀。所以此時,的作用域鏈雖然銷毀了,但是其活動對象仍在內存中。 學習Javascript閉包(Closure)javascript的閉包JavaScript 閉包深入理解(closure)理解 Javascript 的閉包JavaScript ...
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。異步編程入門的全稱是前端經典面試題從輸入到頁面加載發生了什么這是一篇開發的科普類文章,涉及到優化等多個方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結思考,循序漸進的理解 TypeScript。 網絡基礎知識之 HTTP 協議 詳細介紹 HTT...
閱讀 1004·2021-11-25 09:43
閱讀 1672·2019-08-30 13:59
閱讀 1589·2019-08-30 11:22
閱讀 2123·2019-08-30 11:06
閱讀 1299·2019-08-28 17:51
閱讀 3717·2019-08-26 12:12
閱讀 778·2019-08-26 12:11
閱讀 442·2019-08-26 12:10