WEBVTT 00:00:00.981 --> 00:00:05.578 我們又回到用函數 來畫4個溫斯頓的程式了 00:00:05.578 --> 00:00:06.916 我修改了一下 00:00:06.916 --> 00:00:09.236 以便顯示溫斯頓不同人生階段的年紀 00:00:09.236 --> 00:00:11.377 你等一下就會明白 00:00:11.377 --> 00:00:13.549 我要告訴你一件關於溫斯頓的事: 00:00:13.549 --> 00:00:15.901 溫斯頓愛死甜甜圈了 00:00:15.901 --> 00:00:18.437 他每天吃3個 00:00:18.437 --> 00:00:21.653 難怪一張臉又大又黃 00:00:21.653 --> 00:00:25.311 為了提醒他 甜甜圈對身體不好 00:00:25.311 --> 00:00:26.983 我想修改一下程式 00:00:26.983 --> 00:00:31.755 以便顯示於每個年紀 他累計吃下多少甜甜圈 00:00:32.095 --> 00:00:35.763 例如,他2歲時 00:00:35.763 --> 00:00:41.598 他共吃了3﹡365﹡2 00:00:41.598 --> 00:00:45.873 1天3個,1年365天,2年 00:00:45.873 --> 00:00:49.640 讓數量顯示在標頭下 00:00:49.640 --> 00:00:51.515 哇!2千個甜甜圈 00:00:51.515 --> 00:00:54.155 對2歲娃來說太多了 00:00:54.155 --> 00:00:56.812 現在他14歲 00:00:56.812 --> 00:01:04.032 他吃了 3﹡365﹡14 00:01:04.032 --> 00:01:07.636 共吃了1萬5千個甜甜圈 00:01:08.446 --> 00:01:13.050 我一直這樣算也行 但我開始發現一個規律 00:01:13.050 --> 00:01:16.718 我正在重複我的運算 00:01:16.718 --> 00:01:20.316 而我只改變其中的一樣東西:年數 00:01:20.316 --> 00:01:22.872 每當我看到像這樣重複的程式碼 00:01:22.872 --> 00:01:28.228 我便想:「嗯,這能否寫成函數?」 00:01:28.228 --> 00:01:30.465 對,我們絕對可以的 00:01:30.465 --> 00:01:32.795 我們動手吧 00:01:32.795 --> 00:01:34.416 我在這裡定義函數 00:01:34.416 --> 00:01:40.937 叫它做 calcTotalDonuts = function 00:01:40.937 --> 00:01:44.228 裡面只有一個參數,年數 00:01:44.228 --> 00:01:49.312 因為那是我們每次做這計算時 唯一變動的東西 00:01:49.316 --> 00:01:52.878 程式裡面,我們做計算 00:01:52.878 --> 00:02:01.490 將它存為變數 也就是 3﹡365﹡numYears 00:02:01.490 --> 00:02:03.150 我們現在有了這函數 00:02:03.150 --> 00:02:08.639 我將利用 calcTotalDonuts 去取代在這裏的表示式 00:02:08.639 --> 00:02:12.828 以便召喚程式,及傳遞數值 2 00:02:12.828 --> 00:02:16.997 好,現在我們看不到任何總數 00:02:16.997 --> 00:02:18.962 嗯,怎麼了呢? 00:02:19.392 --> 00:02:22.152 我們的函式確實計算了總數 00:02:22.152 --> 00:02:23.096 在這 00:02:23.096 --> 00:02:26.060 但它沒有告知任何人那總數 00:02:26.060 --> 00:02:30.247 好比學校老師點你回答問題 00:02:30.247 --> 00:02:31.704 而你只在腦中回答 00:02:31.704 --> 00:02:33.652 因爲你太害羞去講出答案 00:02:33.652 --> 00:02:37.378 你有答案,但老師永遠不會知道 00:02:37.378 --> 00:02:41.089 如果我們想函數 傳某值給召喚它的人 00:02:41.089 --> 00:02:45.710 函數就要寫明去回傳 (return) 那值 00:02:45.710 --> 00:02:49.599 要函數回傳一個值 我們須輸入 return 00:02:49.599 --> 00:02:51.278 不管它想回傳什麼 00:02:51.278 --> 00:02:55.138 可以是變數、數值或表示式 00:02:55.138 --> 00:02:57.749 這裡我們指明 return totalDonuts 00:02:57.749 --> 00:03:01.870 所以誰召喚此函數 誰就會得到這回答 00:03:01.880 --> 00:03:04.791 總計顯示出來了, 耶! 00:03:04.791 --> 00:03:06.651 這裡我們可簡化函數 00:03:06.651 --> 00:03:08.341 不必儲存成變數 00:03:08.341 --> 00:03:10.051 只需把整個表示式 00:03:10.051 --> 00:03:13.608 寫在 return 裡 函數就變成一行 00:03:13.608 --> 00:03:14.408 好 00:03:15.078 --> 00:03:17.956 現在我們可以來回顧和計算 00:03:17.956 --> 00:03:20.364 每個年紀吃下的甜甜圈總量 00:03:20.364 --> 00:03:24.262 就是召喚這函數 傳遞年數 00:03:24.262 --> 00:03:28.704 嗯,這裡是 calcTotalDonuts(25) 00:03:28.704 --> 00:03:36.036 位置沒錯 calcTotalDonuts(65) 00:03:36.366 --> 00:03:40.241 好!哇!如果他吃到65歲 00:03:40.241 --> 00:03:45.146 他將吃下7萬個甜甜圈 那真是超多甜甜圈 00:03:45.146 --> 00:03:48.051 我不覺得溫斯頓能辦到(笑) 00:03:48.051 --> 00:03:50.331 不過現在我們寫了這函數 00:03:50.331 --> 00:03:53.191 做些小調整並不難 00:03:53.191 --> 00:03:55.138 好比溫斯頓看到這結果 00:03:55.138 --> 00:03:58.865 說: 「噢!這太多了 如果我1天只吃1個?」 00:03:58.865 --> 00:04:02.752 那我們可以來到這 修改這一個數字 00:04:02.752 --> 00:04:04.329 所有都改好了 00:04:04.329 --> 00:04:07.021 2萬3千個,還是很多 00:04:07.021 --> 00:04:10.493 也許溫斯頓說: 「好吧好吧!如果我1週吃1個呢?」 00:04:10.493 --> 00:04:12.477 嗯,這比較合理 00:04:12.477 --> 00:04:15.025 那我們改 365 為 50 00:04:15.025 --> 00:04:17.523 因為一年有50週,對吧? 00:04:18.103 --> 00:04:22.802 好,看來好多了,是吧? 3千個,那蠻合理的 00:04:22.802 --> 00:04:27.031 所以你看,運用函數和數值回傳 00:04:27.031 --> 00:04:30.871 我們能保存程式碼,亦能保護生命