摘要:一什么是閉包閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)。就是創(chuàng)建了一個(gè)匿名函數(shù)調(diào)用函數(shù)解除對(duì)匿名函數(shù)的引用,以便釋放內(nèi)存
一、什么是閉包?
閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)。創(chuàng)建閉包的常見(jiàn)方式就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。
二、為什么要閉包說(shuō)明:變量分為全局變量的局部變量,全局變量的作用域?yàn)槿肿饔糜?,局部變量作用域?yàn)榫植孔饔糜颉V耙黄恼玛P(guān)于作用域鏈給了介紹,可以在函數(shù)內(nèi)部訪問(wèn)全局變量,但是無(wú)法在全局環(huán)境中訪問(wèn)函數(shù)內(nèi)部的變量。
那如果想在全局環(huán)境中訪問(wèn)函數(shù)內(nèi)部變量呢?這時(shí)候就可以使用閉包。
閉包有兩個(gè)最大的用處,一個(gè)是可以在全局作用域中讀取內(nèi)部函數(shù)的的變量,另一個(gè)就是可以讓閉包中引用的變量始終保存在內(nèi)存中。
以下純屬個(gè)人理解,有不同意見(jiàn)歡迎在留言區(qū)討論哈。
如果閉包單純只是為了外部函數(shù)可以讀取內(nèi)部函數(shù)的變量,我們也可以通過(guò)對(duì)象將想要訪問(wèn)的變量輸出就可以,如下所示:
但是閉包的另一個(gè)目的主要是為了讓閉包中引用的變量始終保存在內(nèi)存中,如下圖所示,調(diào)用nAdd函數(shù)修改n的值,可以發(fā)現(xiàn)使用閉包的函數(shù)中n的值+1:
原因:當(dāng)外部函數(shù)f2()執(zhí)行完畢后,其活動(dòng)對(duì)象也不會(huì)被銷毀,因?yàn)槟涿瘮?shù)result2的作用域鏈仍然在引用這個(gè)活動(dòng)對(duì)象。換句話說(shuō),當(dāng)f2()函數(shù)返回后,其執(zhí)行環(huán)境的作用域鏈會(huì)被銷毀,但它被result2引用的活動(dòng)對(duì)象(變量)仍然會(huì)留在內(nèi)存中,直到result2被銷毀,f2被引用的變量才能被回收。
三、使用閉包應(yīng)注意的問(wèn)題由于閉包會(huì)攜帶包含它的函數(shù)的作用域,因此會(huì)比其他函數(shù)占用更多的內(nèi)存。因此可以手動(dòng)解除對(duì)匿名函數(shù)的引用,以便釋放內(nèi)存。
function f2(){ var n=22; var nAdd=function(){n++}; return function(){ return { n:n, nAdd:nAdd } } } //result2就是創(chuàng)建了一個(gè)匿名函數(shù) var result2=f2(); //調(diào)用函數(shù) console.log(result2()); result2().nAdd(); console.log(result2()); //解除對(duì)匿名函數(shù)的引用,以便釋放內(nèi)存 result2=null;
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/94615.html
摘要:如何使用閉包所以這時(shí)候我們就要用閉包去解決這個(gè)問(wèn)題了,先看代碼。計(jì)數(shù)器為這時(shí)候的就形成了一個(gè)閉包。一個(gè)閉包由兩部分組成,函數(shù)和創(chuàng)建該函數(shù)的環(huán)境。就是創(chuàng)建了一個(gè)匿名函數(shù)調(diào)用函數(shù)解除對(duì)匿名函數(shù)的引用,以便釋放內(nèi)存 古老定義 閉包(closure),是指函數(shù)變量可以保存在函數(shù)作用域內(nèi),因此看起來(lái)是函數(shù)將變量包裹了起來(lái)。 //根據(jù)定義,包含變量的函數(shù)就是閉包 function foo() { ...
摘要:從我年開(kāi)始接觸前端,知道閉包這個(gè)詞,已經(jīng)過(guò)去兩年了。概念閉包,在高級(jí)程序設(shè)計(jì)里面是這樣介紹的閉包是指有權(quán)訪問(wèn)另一個(gè)作用域中的變量的函數(shù)。這樣形成的閉包雖然可以使外部可以訪問(wèn)到內(nèi)部的函數(shù),但是導(dǎo)致了原有的作用域鏈不釋放,會(huì)造成內(nèi)存泄漏。 從我16年開(kāi)始接觸前端,知道閉包這個(gè)詞,已經(jīng)過(guò)去兩年了。這兩年里,閉包這個(gè)概念我在很多地方了解過(guò),卻實(shí)在沒(méi)有真的理解,久而久之,變成了一塊心病。這不,趁...
閉包 在 Python 中,函數(shù)也是一個(gè)對(duì)象。因此,我們?cè)诙x函數(shù)時(shí),可以再嵌套定義一個(gè)函數(shù),并將該嵌套函數(shù)返回,比如: from math import pow def make_pow(n): def inner_func(x): # 嵌套定義了 inner_func return pow(x, n) # 注意這里引用了外部函數(shù)的 n return...
摘要:我們說(shuō)觸發(fā)了閉包的函數(shù)叫做閉包函數(shù)閉包最大的特點(diǎn)就是它可以被外層函數(shù)返回后賦值給一個(gè)變量,并且攜帶了外層函數(shù)內(nèi)定義的變量例子如下變量為函數(shù)開(kāi)辟的局部命名空間內(nèi)定義的變量函數(shù)內(nèi)引用了變量的內(nèi)層函數(shù)名被當(dāng)作返回值,此時(shí)閉包規(guī)則達(dá)成。 什么是閉包? 其實(shí)我們?cè)谑褂煤瘮?shù)過(guò)程中不經(jīng)意間就會(huì)觸發(fā)閉包,因?yàn)榭倳?huì)出于某種原因會(huì)在函數(shù)內(nèi)引用或修改上一層函數(shù)的變量,這時(shí)就會(huì)觸發(fā)閉包 那么什么是閉包?其實(shí)就...
閱讀 1678·2021-11-22 09:34
閱讀 1738·2019-08-29 16:36
閱讀 2724·2019-08-29 15:43
閱讀 3166·2019-08-29 13:57
閱讀 1354·2019-08-28 18:05
閱讀 1940·2019-08-26 18:26
閱讀 3307·2019-08-26 10:39
閱讀 3512·2019-08-23 18:40