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