簡而言之:內部函式被外部函式之外的其他變數引用時,就形成了閉包。
在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....