前言
接下來是關於閉包稍微進階一點的方式。
閉包進階
上個章節我們了解到了閉包的最主要觀念在於記憶體的參考以及記憶體的釋放,因此在上個章節的範例我們就可以更進階的去修改成為一個工廠模式,而工廠模式是什麼呢?工廠是一個抽象的概念,最主要是提供一個 interface 來給予使用,因此通常工廠模式中可能會傳遞一些參數,並提供重複性的動作來回傳結果。
以上個章節的範例來講,我們就可以修改成透過使用者傳入參數的方式決定金額
1 2 3 4 5 6 7
| function fn(value) { var money = value || 0; return function(num) { money = money + num; return money; } }
|
因為我們就可以透過 fn 來不停的建立新的閉包,並且都是透過使用者傳遞參數來生成,而這種也稱之為工廠模式
1 2 3 4 5 6 7 8 9 10 11 12 13
| function fn(value) { var money = value || 0; return function(num) { money = money + num; return money; } }
var a = fn(100); a(100);
var b = fn(1000); b(2000);
|
而在此閉包也有另一個特性稱之為私有方法,而私有方法不單只是回傳一個函式,也可以回傳各種方法,例如回傳一個物件,這邊舉例一個我先前寫得閉包範例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| function myMoney(storage) { var money = storage; console.log(money); return function(price) { return { nowMoney: function () { return console.log(money); }, count: function (price) { if(money < price) return console.log('餘額不足,目前餘額: ' + money + ' $'); if (!money <= 0) { return money = money - price; } return console.log('餘額扣除失敗,目前餘額: ' + money + ' $'); } } } }
var ming = myMoney(500);
var mei = myMoney(5000);
var wang = myMoney(30000);
ming().count(100); ming().count(100); ming().count(300);
ming().nowMoney();
mei().count(1600); mei().count(100); mei().count(600);
mei().nowMoney();
wang().count(300);
wang().nowMoney();
|
在上方可以看到 return
回來的是一個物件,透過這個方式我們就可以建立許多的方法,因此這些就稱之為私有方法。
參考文獻