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