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