WEBVTT 00:00:00.694 --> 00:00:03.140 函數的基本概念大家應很熟了 00:00:03.260 --> 00:00:07.013 不過接下來的內容比較複雜 00:00:07.665 --> 00:00:11.121 我要談局部和總體變數的差異 00:00:11.655 --> 00:00:14.020 目前各位可能還不懂這兩個概念 00:00:14.330 --> 00:00:15.921 所以我們先看個例子 00:00:16.553 --> 00:00:20.253 我寫了一個能顯示 我童年時身高變化的程式 00:00:20.365 --> 00:00:22.274 每個人長高速率不同 00:00:22.274 --> 00:00:24.781 所以我設計了 身高變化計算函數(calcInches) 00:00:24.781 --> 00:00:27.882 我傳入起始年齡(startAge) 和終止年齡(endAge) 00:00:28.046 --> 00:00:30.179 及年增高值 (inchesPerYear) 00:00:30.294 --> 00:00:32.141 便能算出童年時期 00:00:32.141 --> 00:00:34.082 總共長高幾寸 00:00:34.854 --> 00:00:36.788 再將數值傳遞給呼叫的函數 00:00:37.342 --> 00:00:40.994 從0到8歲(from 0-8 years)這條開始 00:00:41.143 --> 00:00:44.744 我先呼叫身高變化計算函數 並傳遞0、8和2.5這些值 00:00:44.744 --> 00:00:47.706 2.5代表我當時 每年平均長高2.5英寸 00:00:48.795 --> 00:00:52.195 運算後得到20這個值 00:00:52.420 --> 00:00:58.011 接著在8到16歲(From 8-16 years) 這裡輸入8、16和 2 00:00:58.051 --> 00:01:00.735 這期間我沒什麼長高 運算後跑出16 00:01:02.104 --> 00:01:05.217 目前為止都很好 但我想指定程式顯示 00:01:05.217 --> 00:01:08.101 我童年時一共增高多少? 00:01:09.157 --> 00:01:14.566 要怎麼做呢? 首先得先檢視程式碼 00:01:14.726 --> 00:01:17.394 想想函數包含了哪些值 00:01:17.394 --> 00:01:20.936 有沒有能代表增高總量的值? 00:01:21.034 --> 00:01:26.330 身高變化計算函數裡確實有 增高總量變數(totalInches) 00:01:26.447 --> 00:01:30.084 將這個變數輸出,看看結果如何? 00:01:30.859 --> 00:01:35.398 在文字末尾輸入本文(text) (totalInches, 10, 200) 00:01:36.496 --> 00:01:38.016 好了,試一下 00:01:38.281 --> 00:01:40.893 糟糕!出現錯誤訊息 00:01:41.167 --> 00:01:42.730 提醒我們 00:01:42.791 --> 00:01:45.912 增高總量(totalInches)尚未定義 00:01:46.104 --> 00:01:48.975 不可能啊!我們才定義過 00:01:49.213 --> 00:01:52.349 就在這裡: var totalInches = 00:01:52.630 --> 00:01:53.647 問題癥結在於 00:01:53.677 --> 00:01:59.244 增高總量(totalInches) 是在函數內進行宣告 00:01:59.604 --> 00:02:02.020 當你在函數內宣告任何變數 00:02:02.101 --> 00:02:04.352 此變數會被視為局部變數 00:02:05.244 --> 00:02:08.885 只有在身高變化計算函數內有效 00:02:09.025 --> 00:02:12.305 函數外的程式碼 00:02:12.305 --> 00:02:15.827 看不到函數內的局部變數 00:02:15.927 --> 00:02:17.911 只能辨識回傳內容 00:02:18.239 --> 00:02:21.378 也就是只讀取回傳值 看不到變數 00:02:21.710 --> 00:02:24.502 所以在函數外用增高總量(totalInches) 00:02:24.595 --> 00:02:26.168 程式碼是無法辨識的 00:02:26.227 --> 00:02:28.590 會跳出錯誤: 「喂,我沒見過這個變數 00:02:28.684 --> 00:02:30.941 定義不明,我無法顯示」 00:02:32.417 --> 00:02:34.162 不過有辦法 00:02:34.162 --> 00:02:37.390 讓外部程式碼讀取 增高總量(totalInches) 00:02:37.676 --> 00:02:42.650 關鍵是將此局部變數轉成總體變數 00:02:42.776 --> 00:02:47.205 只要在函數外定義即可 00:02:47.461 --> 00:02:50.348 也就是將此變數搬移到 全作用域(global scope) 00:02:51.004 --> 00:02:54.559 至於函數內要改的就是 00:02:54.682 --> 00:02:58.566 以每次計算取得新值 而非透過定義或宣告 00:02:58.761 --> 00:03:02.550 目前顯示總增高值16 (Total grown over life: 16) 00:03:02.853 --> 00:03:06.519 所以轉換成總體變數後就能被讀取 00:03:06.632 --> 00:03:09.385 不過顯示值並非我們想要的 00:03:09.627 --> 00:03:11.266 這只是最新值而已 00:03:11.481 --> 00:03:13.550 因為每次呼叫此函數 00:03:13.788 --> 00:03:16.912 都會自動以當次運算結果為主 00:03:18.304 --> 00:03:20.482 但我們真正需要的是 00:03:20.482 --> 00:03:24.765 能加總所有數值的新變數 00:03:24.765 --> 00:03:28.962 也就是說 能算出各年齡區間的總增高值 00:03:29.332 --> 00:03:32.563 所以先把增高總量(totalInches) 改回局部變數 00:03:33.431 --> 00:03:38.044 再新增一個總體變數 叫一生總增高值(lifeInches) 00:03:38.674 --> 00:03:40.749 起始點設定為0 00:03:41.092 --> 00:03:45.244 在函數裡我們把數值 加到這項總體變數 00:03:45.424 --> 00:03:49.777 終身英寸+=總增高值 (lifeInches += totalInches) 00:03:50.012 --> 00:03:51.892 之後每次呼叫此函數 00:03:51.892 --> 00:03:56.249 計算值便會新增到 總體變數終身英寸(lifeInches) 00:03:56.324 --> 00:04:00.065 並於最底下顯示結果 text(lifeInches, 10, 200) 00:04:00.239 --> 00:04:03.435 耶!總增高值就出來了! 00:04:03.606 --> 00:04:06.459 不過這不是我目前身高 實際上我更高 00:04:06.459 --> 00:04:07.416 不過這是因為 00:04:07.453 --> 00:04:10.302 人出生時身高大於0 00:04:10.405 --> 00:04:14.207 所以將起始值改成20來算總值 00:04:14.266 --> 00:04:16.516 所得就是我目前實際身高 00:04:17.049 --> 00:04:18.736 好!再複習一次 00:04:19.005 --> 00:04:22.203 增高總量(totalInches)是局部變數 00:04:22.203 --> 00:04:23.389 因其宣告位置 00:04:23.389 --> 00:04:27.788 在函數內部,而非外部 00:04:28.132 --> 00:04:31.064 所以底下的程式碼 00:04:31.251 --> 00:04:34.577 無法判讀 增高總量(totalInches)這項變數 00:04:34.756 --> 00:04:37.838 終身英寸(lifeInches)則是總體變數 00:04:37.976 --> 00:04:40.471 因其宣告位置在全作用域(global scope) 00:04:40.471 --> 00:04:43.227 不在任何函數內 00:04:43.409 --> 00:04:45.311 編寫函數和變數時 00:04:45.311 --> 00:04:47.234 務必記住此規則 00:04:47.234 --> 00:04:48.276 請自問 00:04:48.431 --> 00:04:51.488 是想要只供函數內部用的 局部變數(local variable) 00:04:51.631 --> 00:04:54.486 還是整個程式通用的 總體變數(global variable) 00:04:54.692 --> 00:04:57.431 若你一時間覺得很難懂也不用擔心 00:04:57.507 --> 00:05:00.268 畢竟這本來就是 程式語言中比較難的概念 00:05:00.268 --> 00:05:01.748 以Javascript語言來說就更複雜了 00:05:01.891 --> 00:05:04.476 但只要多練習就能上手了