1 00:00:00,694 --> 00:00:03,140 函數的基本概念大家應很熟了 2 00:00:03,260 --> 00:00:07,013 不過接下來的內容比較複雜 3 00:00:07,665 --> 00:00:11,121 我要談局部和總體變數的差異 4 00:00:11,655 --> 00:00:14,020 目前各位可能還不懂這兩個概念 5 00:00:14,330 --> 00:00:15,921 所以我們先看個例子 6 00:00:16,553 --> 00:00:20,253 我寫了一個能顯示 我童年時身高變化的程式 7 00:00:20,365 --> 00:00:22,274 每個人長高速率不同 8 00:00:22,274 --> 00:00:24,781 所以我設計了 身高變化計算函數(calcInches) 9 00:00:24,781 --> 00:00:27,882 我傳入起始年齡(startAge) 和終止年齡(endAge) 10 00:00:28,046 --> 00:00:30,179 及年增高值 (inchesPerYear) 11 00:00:30,294 --> 00:00:32,141 便能算出童年時期 12 00:00:32,141 --> 00:00:34,082 總共長高幾寸 13 00:00:34,854 --> 00:00:36,788 再將數值傳遞給呼叫的函數 14 00:00:37,342 --> 00:00:40,994 從0到8歲(from 0-8 years)這條開始 15 00:00:41,143 --> 00:00:44,744 我先呼叫身高變化計算函數 並傳遞0、8和2.5這些值 16 00:00:44,744 --> 00:00:47,706 2.5代表我當時 每年平均長高2.5英寸 17 00:00:48,795 --> 00:00:52,195 運算後得到20這個值 18 00:00:52,420 --> 00:00:58,011 接著在8到16歲(From 8-16 years) 這裡輸入8、16和 2 19 00:00:58,051 --> 00:01:00,735 這期間我沒什麼長高 運算後跑出16 20 00:01:02,104 --> 00:01:05,217 目前為止都很好 但我想指定程式顯示 21 00:01:05,217 --> 00:01:08,101 我童年時一共增高多少? 22 00:01:09,157 --> 00:01:14,566 要怎麼做呢? 首先得先檢視程式碼 23 00:01:14,726 --> 00:01:17,394 想想函數包含了哪些值 24 00:01:17,394 --> 00:01:20,936 有沒有能代表增高總量的值? 25 00:01:21,034 --> 00:01:26,330 身高變化計算函數裡確實有 增高總量變數(totalInches) 26 00:01:26,447 --> 00:01:30,084 將這個變數輸出,看看結果如何? 27 00:01:30,859 --> 00:01:35,398 在文字末尾輸入本文(text) (totalInches, 10, 200) 28 00:01:36,496 --> 00:01:38,016 好了,試一下 29 00:01:38,281 --> 00:01:40,893 糟糕!出現錯誤訊息 30 00:01:41,167 --> 00:01:42,730 提醒我們 31 00:01:42,791 --> 00:01:45,912 增高總量(totalInches)尚未定義 32 00:01:46,104 --> 00:01:48,975 不可能啊!我們才定義過 33 00:01:49,213 --> 00:01:52,349 就在這裡: var totalInches = 34 00:01:52,630 --> 00:01:53,647 問題癥結在於 35 00:01:53,677 --> 00:01:59,244 增高總量(totalInches) 是在函數內進行宣告 36 00:01:59,604 --> 00:02:02,020 當你在函數內宣告任何變數 37 00:02:02,101 --> 00:02:04,352 此變數會被視為局部變數 38 00:02:05,244 --> 00:02:08,885 只有在身高變化計算函數內有效 39 00:02:09,025 --> 00:02:12,305 函數外的程式碼 40 00:02:12,305 --> 00:02:15,827 看不到函數內的局部變數 41 00:02:15,927 --> 00:02:17,911 只能辨識回傳內容 42 00:02:18,239 --> 00:02:21,378 也就是只讀取回傳值 看不到變數 43 00:02:21,710 --> 00:02:24,502 所以在函數外用增高總量(totalInches) 44 00:02:24,595 --> 00:02:26,168 程式碼是無法辨識的 45 00:02:26,227 --> 00:02:28,590 會跳出錯誤: 「喂,我沒見過這個變數 46 00:02:28,684 --> 00:02:30,941 定義不明,我無法顯示」 47 00:02:32,417 --> 00:02:34,162 不過有辦法 48 00:02:34,162 --> 00:02:37,390 讓外部程式碼讀取 增高總量(totalInches) 49 00:02:37,676 --> 00:02:42,650 關鍵是將此局部變數轉成總體變數 50 00:02:42,776 --> 00:02:47,205 只要在函數外定義即可 51 00:02:47,461 --> 00:02:50,348 也就是將此變數搬移到 全作用域(global scope) 52 00:02:51,004 --> 00:02:54,559 至於函數內要改的就是 53 00:02:54,682 --> 00:02:58,566 以每次計算取得新值 而非透過定義或宣告 54 00:02:58,761 --> 00:03:02,550 目前顯示總增高值16 (Total grown over life: 16) 55 00:03:02,853 --> 00:03:06,519 所以轉換成總體變數後就能被讀取 56 00:03:06,632 --> 00:03:09,385 不過顯示值並非我們想要的 57 00:03:09,627 --> 00:03:11,266 這只是最新值而已 58 00:03:11,481 --> 00:03:13,550 因為每次呼叫此函數 59 00:03:13,788 --> 00:03:16,912 都會自動以當次運算結果為主 60 00:03:18,304 --> 00:03:20,482 但我們真正需要的是 61 00:03:20,482 --> 00:03:24,765 能加總所有數值的新變數 62 00:03:24,765 --> 00:03:28,962 也就是說 能算出各年齡區間的總增高值 63 00:03:29,332 --> 00:03:32,563 所以先把增高總量(totalInches) 改回局部變數 64 00:03:33,431 --> 00:03:38,044 再新增一個總體變數 叫一生總增高值(lifeInches) 65 00:03:38,674 --> 00:03:40,749 起始點設定為0 66 00:03:41,092 --> 00:03:45,244 在函數裡我們把數值 加到這項總體變數 67 00:03:45,424 --> 00:03:49,777 終身英寸+=總增高值 (lifeInches += totalInches) 68 00:03:50,012 --> 00:03:51,892 之後每次呼叫此函數 69 00:03:51,892 --> 00:03:56,249 計算值便會新增到 總體變數終身英寸(lifeInches) 70 00:03:56,324 --> 00:04:00,065 並於最底下顯示結果 text(lifeInches, 10, 200) 71 00:04:00,239 --> 00:04:03,435 耶!總增高值就出來了! 72 00:04:03,606 --> 00:04:06,459 不過這不是我目前身高 實際上我更高 73 00:04:06,459 --> 00:04:07,416 不過這是因為 74 00:04:07,453 --> 00:04:10,302 人出生時身高大於0 75 00:04:10,405 --> 00:04:14,207 所以將起始值改成20來算總值 76 00:04:14,266 --> 00:04:16,516 所得就是我目前實際身高 77 00:04:17,049 --> 00:04:18,736 好!再複習一次 78 00:04:19,005 --> 00:04:22,203 增高總量(totalInches)是局部變數 79 00:04:22,203 --> 00:04:23,389 因其宣告位置 80 00:04:23,389 --> 00:04:27,788 在函數內部,而非外部 81 00:04:28,132 --> 00:04:31,064 所以底下的程式碼 82 00:04:31,251 --> 00:04:34,577 無法判讀 增高總量(totalInches)這項變數 83 00:04:34,756 --> 00:04:37,838 終身英寸(lifeInches)則是總體變數 84 00:04:37,976 --> 00:04:40,471 因其宣告位置在全作用域(global scope) 85 00:04:40,471 --> 00:04:43,227 不在任何函數內 86 00:04:43,409 --> 00:04:45,311 編寫函數和變數時 87 00:04:45,311 --> 00:04:47,234 務必記住此規則 88 00:04:47,234 --> 00:04:48,276 請自問 89 00:04:48,431 --> 00:04:51,488 是想要只供函數內部用的 局部變數(local variable) 90 00:04:51,631 --> 00:04:54,486 還是整個程式通用的 總體變數(global variable) 91 00:04:54,692 --> 00:04:57,431 若你一時間覺得很難懂也不用擔心 92 00:04:57,507 --> 00:05:00,268 畢竟這本來就是 程式語言中比較難的概念 93 00:05:00,268 --> 00:05:01,748 以Javascript語言來說就更複雜了 94 00:05:01,891 --> 00:05:04,476 但只要多練習就能上手了