【Javascript 拾遗之三】Closure 闭包
Closure 閉包
1、閉包的定義
-離散數學
一個關系不具有自反, 對稱, 傳遞這3種基本性質之一,但均可以通過對該關系的擴充(在關系中增添序偶),使擴充后的關系具有這種性質,這種包含該關系的最小擴充稱為該關系關于這種性質的閉包.下面給出閉包的定義:
設R是X上的關系,R的自反(或對稱,傳遞)閉包R1是這樣的:包含R(或R包含于R1)的自反(或對稱,傳遞)關系,對任意的自反(或對稱,傳遞) 關系S,如果R包含于S,則必有R1包含于S.
滿足的條件:
設R是非空集合A上的關系, R的自反(對稱或傳遞)閉包是A上的關系R' ,滿足 (1) R'是自反的(或對稱的,或傳遞的) (2) ?R?R'
????? (3)對A上任何包含[R的自反(或對稱的,或傳遞的)]關系R" 有R'?R"
?????
r(R) - R的自反閉包, reflexivity
s(R) - R的對稱閉包, symmetry
t(R) - R的傳遞閉包。 transmit
R={<a,b>,<b,a>,<b,c>,<c,d>}
r(R)={<a,a>,<b,b>,<c,c>,<d,d>,<a,b>,<b,a>,<b,c>,<c,d>}
s(R)={<a,b>,<b,a>,<b,c>,<c,b>,<c,d>,<d,c>}
t(R)={<a,b>,<a,b>,<a,c>,<a,d>,<b,c>,<b,d>,<b,a>,<b,b>,<c,d>}
-Javascript
在Javascript高級程序設計中提到:Javascript閉包就是在函數中定義函數,實現的功能就是在函數外部也能訪問函數內部的局部變量。
1 var closure = function(){ 2 var a = 100; 3 var alertA = function(){ 4 return(a); 5 } 6 return alertA; 7 } 8 console.log(closure()()); //100這個玩意就是閉包,他可以在函數外部訪問函數內部的變量,是不是很神奇?
其實沒啥神奇的,代碼示例中closure()執行了closure這個方法,返回了一個匿名函數,這是一個沒有執行的匿名函數,然后通過()函數運算符,執行了closure中的alertA這個方法。alertA返回了私有變量a的值,我們稱在子函數中使用父函數的局部變量的結構為閉包結構。
?
2、閉包的應用
-模塊化代碼
我們再看一個例子
1 function createFunctions(){ 2 var result = new Array(); 3 4 for(var i = 0; i < 10; i++){ 5 result[i] = function(num){ 6 return function(){ 7 return num; 8 } 9 }(i); 10 } 11 return result; 12 } 13 14 var funcs = createFunctions(); 15 for(var i = 0; i < funcs.length; i++){ 16 console.log(funcs[i]()); 17 }?
代碼示例中createFunctions返回了一個數組,該數組指向多個定義的匿名函數生成的對象,這個閉包可以通過數組不同的索引來調用,相當于一個多元的閉包,在模塊化開發時候可以使用這個結構。
3、閉包的缺點
-內存泄露
1 function assignHandler(){ 2 var element = document.getElementById('someElement'); 3 var id = element.id 4 element.onclick = function(){ 5 alert(id); // modified -> someElement save as local variable 6 alert(element.id); //error element is null 7 } 8 element = null; // modified -> release mem invoked by element 9 return function(){ 10 console.log(element); // null 11 } 12 } 13 var m = assignHandler(); 14 m();代碼實例中是一個閉包結構,修改部分用//modified ->標注了,未修改前,在IE瀏覽器中,由于IE的內存回收機制,element.onclick 引用的匿名函數中調用了element.id致使element對象得不到釋放,一直存貯在內存中,如果這個函數被調用多次,那么內存中的element引用會越來越多,導致內存泄露。此例是指在引用Html element時候,放在閉包內對象得不到釋放而導致的。因此,在使用閉包的同時要注意內存的釋放。
4、總結
?本文通過幾個簡單的例子介紹了Javascript的閉包及其應用,實際開發中由于閉包長期內存需要代碼釋放和比較難理解的語法,所以在沒有必要的情況下不建議使用閉包。
5、參考資料
Javascript 高級程序設計第二版
http://cise.sdust.edu.cn/lssx/7StressResolve/cha3/36.htm
?
轉載于:https://www.cnblogs.com/keaixiaoye/p/4184367.html
總結
以上是生活随笔為你收集整理的【Javascript 拾遗之三】Closure 闭包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 周进度总结表(一)
- 下一篇: Java基础(三十二)JDBC(2)连接