JS 閉包的那些事兒

2021-08-04 09:24:09 字數 1671 閱讀 3768

簡而言之:內部函式被外部函式之外的其他變數引用時,就形成了閉包。

在js裡,如果乙個物件不再被引用時,就會被gc**,否則就一直儲存在記憶體中。

當我們需要在模組中定義一些變數,並希望這些變數一直儲存在記憶體中但又不會「汙染」全域性的變數時,就可以用閉包來定義這個模組。

functiona(

)returnb;

}varc=

a();

c();

//1c()

;//2c(

);//3

閉包允許將函式與其所操作的某些資料(環境)關連起來。這顯然類似於物件導向程式設計。在物件導向程式設計中,物件允許我們將某些資料(物件的屬性)與乙個或者多個方法相關聯。因而,一般說來,可以使用只有乙個方法的物件的地方,都可以使用閉包。

以下是乙個實際的示例:假設我們想在頁面上新增一些可以調整字型大小的按鈕。一種方法是以畫素為單位指定 body 元素的 font-size,然後通過相對的 em 單位設定頁面中其它元素(例如頁首)的字型大小:

css 如下:

body

h1h2

html 如下:

href

="#"

id="size-12"

>

12a>

href

="#"

id="size-14"

>

14a>

href

="#"

id="size-16"

>

16a>

js 如下:

function

makesizer

(size);}

var size12 =

makesizer(12

);var size14 =

makesizer(14

);var size16 =

makesizer(16

);document.

getelementbyid

('size-12'

).onclick = size12;

document.

getelementbyid

('size-14'

).onclick = size14;

document.

getelementbyid

('size-16'

).onclick = size16;

如果不是因為某些特殊任務而需要閉包,在沒有必要的情況下,在其它函式中建立函式是不明智的,因為閉包對指令碼效能具有負面影響,包括處理速度和記憶體消耗。

例如,在建立新的物件或者類時,方法通常應該關聯於物件的原型,而不是定義到物件的構造器中。原因是這將導致每次構造器被呼叫,方法都會被重新賦值一次(也就是說,為每乙個物件的建立)。

寫乙個add()函式,使得add(a,b)和add(a)(b)輸出結果相同

function

add(a,b)

else}}

add(3,

4);//7

add(3)

(4);

//7

Swift那些事兒 閉包(捕獲值)

參考 閉包可以在其定義的上下文中捕獲常量或變數。即使定義這些常量和變數的原域已經不存在,閉包仍然可以在閉包函式體內引用和修改這些值。swift最簡單的閉包形式是巢狀函式,也就是定義在其他函式的函式體內的函式。巢狀函式可以捕獲其外部函式所有的引數以及定義的常量和變數。import cocoa func...

閉包那些事

定義 在乙個內部函式裡,對在外部作用域 但不是在全域性作用域 的變數進行引用,那麼內部函式就被認為是閉包 closure 例子 1 defmake adder addend 2def adder augend 3return augend addend 4return adder 6 p make ...

談談Js繼承的那些事兒

1.使用物件冒充實現繼承 實現原理 讓父類的建構函式成為子類的方法,然後呼叫該子類的方法,以實現物件的繼承。var people function name,age people.prototype.showpinfo function var men function men.prototype....