日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Javascript 拾遗之三】Closure 闭包

發布時間:2023/12/18 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Javascript 拾遗之三】Closure 闭包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
說起閉包這個概念,其實是離散數學中的一種定義,而很程序員們耳熟能詳但不一定能說清楚它的含義和用途。本文先簡單地介紹下離散數學中的閉包,然后再探討一下Javascript語言中的閉包是如何創建和應用的。

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 闭包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。