[閉包的概念|青训营笔记]

42 阅读2分钟

閉包是一個函數對其周圍狀態的引用捆綁在一起,或者說函數被引入包圍,這樣的組合就是閉包。 也就是說,閉包可以讓你在一個內層函數中訪問到其外層函數的作用域。 在JS中,每當創建一個函數,閉包就會在函數創建的同時被創建出來,作為函數內部與外部連接的一座橋樑。 function init() { var name = "Mozilla"; // name 是一个被 init 创建的局部变量 function displayName() { // displayName() 是内部函数,一个闭包 alert(name); // 使用了父函数中声明的变量 } displayName();}init(); displayName()沒有自己的局部變量,然而,由於閉包的特性,他可以訪問到外部函數的變量。

閉包的使用場景有如下幾個,一創建私有變量,二延長變量的生命週期。 一般函數的詞法環境在函數返回過後就被銷毀,但閉包會保存對創建時所在詞法環境的引用,即便創建時所在的執行上下文被銷毀,但創建時的詞法環境依然存在,以達到延長變量的生命週期的目的。 如果不是某些特定的任務需要使用閉包,在其他函數中創建函數是不明智的,因為閉包在處理速度和內存消耗方面對腳本性能有負面影響。 例如,在創建新的對象或者類時,方法通常應該關聯與對象的原型,而不是定義到對象的構造器中。 如何理解Set、Map? Set是一種叫做集合的數據結構,Map是一種叫做字典的數據結構。 集合是一堆無序的、相關聯的且不重複的內存結構組成的組合。 字典是一些元素的集合。每個元素都有一個稱作key的域,不同元素的key各不相同。