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