[JavaScriptWeird]No.66 Closure 可以應用在哪

前言

好的終於到閉包的最後一個章節了,前面有提到一個小範例是關於金魚腦的小明,那除了這樣的情境可以利用閉包之外,還有一個情境是可以利用閉包達成的,讓我們一起看看。

利用閉包達成私有變數

情境是這樣的,我有 100 元,如果我的錢變多了,就利用某個函式讓錢增加,如果支出超過 10 元,最多就只能付出10元。

讓我們看一段沒有利用閉包的程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var myMoney = 100;  
function addMoney(addmoney){
myMoney = myMoney + addmoney;
}

function payMoney(paymoney){
if (paymoney > 10){
myMoney = myMoney - 10;
} else {
myMoney = myMoney - paymoney;
}
}

addMoney(1);
payMoney(11);
console.log(myMoney); // 91

好的,這樣我們就完成了這段情境的敘述。

但是有個問題,如果今天與別人協作,別人如果沒有遵照我們訂的函式下去做增減,是可以直接對 myMoney 重新賦值 的,那這樣是不是不太 OK 呢?

因此我們要利用閉包將變數私有化,令別人無法在外部直接對變數賦值,只能透過我們提供的方法來變更值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function myWallet(InitMoney){  
var myMoney = InitMoney;
return {
addMoney: function(addmoney){
myMoney = myMoney + addmoney;
},
payMoney: function(paymoney){
if (paymoney > 10){
myMoney = myMoney - 10;
} else {
myMoney = myMoney - paymoney;
}
},
showMoney: function(){
console.log(myMoney);
}
}
}

var myWallet = myWallet(100);
myWallet.addMoney(1);
myWallet.payMoney(11);
myWallet.showMoney(); // 91

透過閉包可以確保讓我們的變數不會突然被修改掉,而且只能用我們定義好的函式對內部的變數進行操作,這樣一來可以確保變數是安全的。

朕不給的,你不能要!

心得

接著就是物件導向的部分啦~不知不覺也複習了這麼多東西呢,也是該好好的認識一下物件導向了,尤其是物件導向的部分,這個名詞該如何簡單又白話的解釋呢?

0%