国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

js閉包所用的場合以及優(yōu)缺點分析

2019-11-20 12:12:11
字體:
供稿:網(wǎng)友

先上段代碼:

//函數(shù)afunction a(){var i=0;//函數(shù)bfunction b(){alert(++i);}return b;}//函數(shù)cvar c = a();c();

代碼特點:

1、函數(shù)b嵌套在函數(shù)a內(nèi)部;
2、函數(shù)a返回函數(shù)b。
代碼中函數(shù)a的內(nèi)部函數(shù)b,被函數(shù)a外面的一個變量c引用的時候,這就叫創(chuàng)建了一個閉包。有時候函數(shù)b也可以用一個匿名函數(shù)代替來返回,即return function(){};

優(yōu)點:1.保護函數(shù)內(nèi)的變量安全,加強了封裝性 2.在內(nèi)存中維持一個變量(用的太多就變成了缺點,占內(nèi)存)
閉包之所以會占用資源是當函數(shù)a執(zhí)行結(jié)束后, 變量i不會因為函數(shù)a的結(jié)束而銷毀, 因為b的執(zhí)行需要依賴a中的變量。
不適合場景:返回閉包的函數(shù)是個非常大的函數(shù)

閉包的典型框架應該就是jquery了。

閉包是javascript語言的一大特點,主要應用閉包場合主要是為了:設計私有的方法和變量。
這在做框架的時候體現(xiàn)更明顯,有些方法和屬性只是運算邏輯過程中的使用的,不想讓外部修改這些屬性,因此就可以設計一個閉包來只提供方法獲取。

閉包的缺點就是常駐內(nèi)存,會增大內(nèi)存使用量,使用不當很容易造成內(nèi)存泄露。

總結(jié)一下:

優(yōu)點:

1. 邏輯連續(xù),當閉包作為另一個函數(shù)調(diào)用的參數(shù)時,避免你脫離當前邏輯而單獨編寫額外邏輯。
2. 方便調(diào)用上下文的局部變量。
3. 加強封裝性,第2點的延伸,可以達到對變量的保護作用。

缺點:

閉包有一個非常嚴重的問題,那就是內(nèi)存浪費問題,這個內(nèi)存浪費不僅僅因為它常駐內(nèi)存,更重要的是,對閉包的使用不當會造成無效內(nèi)存的產(chǎn)生,看下面的例子:

var array = [];function abc() {var foo = function(){}array.push(foo);return foo;}for(var i = 0 ; i < 10000; i ++){abc();}alert(array[0] == array[1]);

通過上面的測試我們會看到這一萬次abc()執(zhí)行所產(chǎn)生的同一個邏輯的閉包的地址并不相同,也就是說它生產(chǎn)了一堆的一模一樣的Function對象,這樣有好處就是可以以工廠模式產(chǎn)生函數(shù)以備使用,然而如果你的稍有不慎將閉包當做常態(tài)邏輯使用,就不可避免的會造成內(nèi)存垃圾。當中換個語法可能更好理解:

var foo = new Function();

所以關于閉包,就我自己的習慣而言,能不用就不用,如果非用不可,那就想辦法保持閉包對象的數(shù)量很少甚至唯一。

以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 尚义县| 罗田县| 咸丰县| 尖扎县| 南涧| 新营市| 泰兴市| 锡林郭勒盟| 葫芦岛市| 刚察县| 惠东县| 裕民县| 获嘉县| 察雅县| 高台县| 承德县| 塘沽区| 南投县| 彭水| 双牌县| 隆回县| 阿城市| 三河市| 静宁县| 土默特右旗| 新蔡县| 桃园县| 诸暨市| 马山县| 伊川县| 洞头县| 即墨市| 竹溪县| 汉中市| 河间市| 永昌县| 韶关市| 绍兴县| 桃江县| 赫章县| 中江县|