首頁  >  文章  >  web前端  >  js閉包所用的場合以及優缺點分析_javascript技巧

js閉包所用的場合以及優缺點分析_javascript技巧

WBOY
WBOY原創
2016-05-16 15:53:391359瀏覽

先上段程式碼:

//函数a
function a()
{
var i=0;
//函数b
function b()
{
alert(++i);
}
return b;
}
//函数c
var c = a();
c();

程式碼特點:

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

優點:1.保護函數內的變數安全,加強了封裝性 2.在記憶體中維持一個變數(用的太多就變成了缺點,佔記憶體)
閉包之所以會佔用資源是當函數a執行結束後, 變數i不會因為函數a的結束而銷毀, 因為b的執行需要依賴a中的變數。
不適合場景:傳回閉包的函數是個非常大的函數

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

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

閉包的缺點就是常駐內存,會增加內存使用量,使用不當很容易造成內存洩漏。

總結一下:

優點:

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

缺點:

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

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()執行所產生的同一個邏輯的閉包的地址並不相同,也就是說它生產了一堆的一模一樣的Function對象,這樣有好處就是可以以工廠模式產生函數以備使用,然而如果你的稍有不慎將閉包當作常態邏輯使用,就不可避免的會造成記憶體垃圾。當中換個語法可能更好理解:

var foo = new Function();

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

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn