摘要:什么是閉包給出的官方回答是閉包是由函數以及創建該函數的詞法環境組合而成。這就是閉包的核心。當函數執行完后,被作為返回值函數保留在了作用域中。閉包還有一個作用是模擬私有方法和變量。閉包的缺點由上文可知閉包的作用可以使數據保存在內存中。
什么是閉包?
MDN給出的官方回答是“閉包是由函數以及創建該函數的詞法環境組合而成。這個環境包含了這個閉包創建時所能訪問的所有局部變量”
看代碼
//一個函數里面包含了另一個函數,最后已返回值返回被包裹的的函數。 function func() { let a = 1; function closer(){ console.log(a) } return closer } let b = func() b() // 1
按照正常的js作用域,當func執行完后a已經被銷毀,但是變量b仍然能夠訪問到它里面的變量。
這就是閉包的核心。當函數執行完后,被作為返回值函數保留在了作用域中。以至于里面的數據沒有被銷毀,仍然可以訪問到。
閉包還有一個作用是模擬私有方法和變量。要知道,js是不支持定義私有方法和變量的。
通過這個類作為對象返回私有方法和屬性,便可以保證它們只可以被Create所調用。
function Create(){ var privateCounter = 0; function changeBy(val) { privateCounter += val; } return { increment: function() { changeBy(1); }, decrement: function() { changeBy(-1); }, value: function() { return privateCounter; } } }
閉包的缺點
由上文可知閉包的作用可以使數據保存在內存中。當濫用閉包,也會導致內存占用過多,影響性能
解決閉包的問題
當你已經確定某些數據不會再被調用時,可以把閉包刪除或者設為null
總結
當一個函數能夠記住并訪問到其所在的詞法作用域及作用域鏈,特別強調是在其定義的作用域外進行的訪問,此時該函數和其上層執行上下文共同構成閉包
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/104987.html
摘要:最近在寫代碼時遇到了閉包,其中閉包又和立即執行函數有點關系,于是牽扯除了函數聲明以及函數表達式,我感覺中文的很多文章寫的不太好,查閱了的指南和這篇關于的文章,覺得寫的很好,整合一下。函數聲明和函數表達式。 最近在寫代碼時遇到了閉包,其中閉包又和立即執行函數(immediately invoked function expression, aka IIFE)有點關系,于是牽扯除了函數聲明...
摘要:引用一個的提問個人覺得總結的比較好的兩句話原文地址另外,附上中對閉包的講解閉包中文對于閉包的簡要概括原文原文地址匿名函數和閉包來自文章作者版權聲明自由轉載非商用非衍生保持署名創意共享許可證轉載請注明出處 引用一個stackoverflow的提問 個人覺得總結的比較好的兩句話: An anonymous function is just a function that has no na...
摘要:昨天被人問到的的作用是什么這個倒還能回答出來,之后返回一個新的函數,這個函數可以保持傳遞的上下文。沒有完全實現規定的。比如規定了的和行為。 https://friskfly.github.io/2016/03/24/about-function-bind-in-js/ 昨天被人問到js的bind的作用是什么? 這個倒還能回答出來,bind 之后返回一個新的函數,這個函數可以保持傳遞的t...
摘要:閉包的學術定義先來參考下各大權威對閉包的學術定義百科閉包,又稱詞法閉包或函數閉包,是引用了自由變量的函數。所以,有另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。 前言 上一章講解了閉包的底層實現細節,我想大家對閉包的概念應該也有了個大概印象,但是真要用簡短的幾句話來說清楚,這還真不是件容易的事。這里我們就來總結提煉下閉包的概念,以應付那些非專人士的心血來潮。 閉包的學術...
閱讀 2804·2021-11-19 11:35
閱讀 2582·2021-11-02 14:40
閱讀 1396·2021-09-04 16:48
閱讀 3009·2019-08-30 15:55
閱讀 1753·2019-08-30 13:11
閱讀 1956·2019-08-29 11:12
閱讀 1088·2019-08-27 10:52
閱讀 3157·2019-08-26 18:36