[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.69,0:00:03.14,Default,,0000,0000,0000,,函數的基本概念大家應很熟了 Dialogue: 0,0:00:03.26,0:00:07.01,Default,,0000,0000,0000,,不過接下來的內容比較複雜 Dialogue: 0,0:00:07.66,0:00:11.12,Default,,0000,0000,0000,,我要談局部和總體變數的差異 Dialogue: 0,0:00:11.66,0:00:14.02,Default,,0000,0000,0000,,目前各位可能還不懂這兩個概念 Dialogue: 0,0:00:14.33,0:00:15.92,Default,,0000,0000,0000,,所以我們先看個例子 Dialogue: 0,0:00:16.55,0:00:20.25,Default,,0000,0000,0000,,我寫了一個能顯示\N我童年時身高變化的程式 Dialogue: 0,0:00:20.36,0:00:22.27,Default,,0000,0000,0000,,每個人長高速率不同 Dialogue: 0,0:00:22.27,0:00:24.78,Default,,0000,0000,0000,,所以我設計了\N身高變化計算函數(calcInches) Dialogue: 0,0:00:24.78,0:00:27.88,Default,,0000,0000,0000,,我傳入起始年齡(startAge)\N和終止年齡(endAge) Dialogue: 0,0:00:28.05,0:00:30.18,Default,,0000,0000,0000,,及年增高值 (inchesPerYear) Dialogue: 0,0:00:30.29,0:00:32.14,Default,,0000,0000,0000,,便能算出童年時期 Dialogue: 0,0:00:32.14,0:00:34.08,Default,,0000,0000,0000,,總共長高幾寸 Dialogue: 0,0:00:34.85,0:00:36.79,Default,,0000,0000,0000,,再將數值傳遞給呼叫的函數 Dialogue: 0,0:00:37.34,0:00:40.99,Default,,0000,0000,0000,,從0到8歲(from 0-8 years)這條開始 Dialogue: 0,0:00:41.14,0:00:44.74,Default,,0000,0000,0000,,我先呼叫身高變化計算函數\N並傳遞0、8和2.5這些值 Dialogue: 0,0:00:44.74,0:00:47.71,Default,,0000,0000,0000,,2.5代表我當時\N每年平均長高2.5英寸 Dialogue: 0,0:00:48.80,0:00:52.20,Default,,0000,0000,0000,,運算後得到20這個值\N Dialogue: 0,0:00:52.42,0:00:58.01,Default,,0000,0000,0000,,接著在8到16歲(From 8-16 years)\N這裡輸入8、16和 2 Dialogue: 0,0:00:58.05,0:01:00.74,Default,,0000,0000,0000,,這期間我沒什麼長高\N運算後跑出16 Dialogue: 0,0:01:02.10,0:01:05.22,Default,,0000,0000,0000,,目前為止都很好\N但我想指定程式顯示 Dialogue: 0,0:01:05.22,0:01:08.10,Default,,0000,0000,0000,,我童年時一共增高多少? Dialogue: 0,0:01:09.16,0:01:14.57,Default,,0000,0000,0000,,要怎麼做呢?\N首先得先檢視程式碼 Dialogue: 0,0:01:14.73,0:01:17.39,Default,,0000,0000,0000,,想想函數包含了哪些值 Dialogue: 0,0:01:17.39,0:01:20.94,Default,,0000,0000,0000,,有沒有能代表增高總量的值? Dialogue: 0,0:01:21.03,0:01:26.33,Default,,0000,0000,0000,,身高變化計算函數裡確實有\N增高總量變數(totalInches) Dialogue: 0,0:01:26.45,0:01:30.08,Default,,0000,0000,0000,,將這個變數輸出,看看結果如何? Dialogue: 0,0:01:30.86,0:01:35.40,Default,,0000,0000,0000,,在文字末尾輸入本文(text)\N(totalInches, 10, 200) Dialogue: 0,0:01:36.50,0:01:38.02,Default,,0000,0000,0000,,好了,試一下 Dialogue: 0,0:01:38.28,0:01:40.89,Default,,0000,0000,0000,,糟糕!出現錯誤訊息 Dialogue: 0,0:01:41.17,0:01:42.73,Default,,0000,0000,0000,,提醒我們 Dialogue: 0,0:01:42.79,0:01:45.91,Default,,0000,0000,0000,,增高總量(totalInches)尚未定義 Dialogue: 0,0:01:46.10,0:01:48.98,Default,,0000,0000,0000,,不可能啊!我們才定義過 Dialogue: 0,0:01:49.21,0:01:52.35,Default,,0000,0000,0000,,就在這裡: var totalInches = Dialogue: 0,0:01:52.63,0:01:53.65,Default,,0000,0000,0000,,問題癥結在於 Dialogue: 0,0:01:53.68,0:01:59.24,Default,,0000,0000,0000,,增高總量(totalInches)\N是在函數內進行宣告 Dialogue: 0,0:01:59.60,0:02:02.02,Default,,0000,0000,0000,,當你在函數內宣告任何變數 Dialogue: 0,0:02:02.10,0:02:04.35,Default,,0000,0000,0000,,此變數會被視為局部變數 Dialogue: 0,0:02:05.24,0:02:08.88,Default,,0000,0000,0000,,只有在身高變化計算函數內有效 Dialogue: 0,0:02:09.02,0:02:12.30,Default,,0000,0000,0000,,函數外的程式碼 Dialogue: 0,0:02:12.30,0:02:15.83,Default,,0000,0000,0000,,看不到函數內的局部變數 Dialogue: 0,0:02:15.93,0:02:17.91,Default,,0000,0000,0000,,只能辨識回傳內容 Dialogue: 0,0:02:18.24,0:02:21.38,Default,,0000,0000,0000,,也就是只讀取回傳值 \N看不到變數 Dialogue: 0,0:02:21.71,0:02:24.50,Default,,0000,0000,0000,,所以在函數外用增高總量(totalInches) Dialogue: 0,0:02:24.60,0:02:26.17,Default,,0000,0000,0000,,程式碼是無法辨識的 Dialogue: 0,0:02:26.23,0:02:28.59,Default,,0000,0000,0000,,會跳出錯誤:\N「喂,我沒見過這個變數 Dialogue: 0,0:02:28.68,0:02:30.94,Default,,0000,0000,0000,,定義不明,我無法顯示」 Dialogue: 0,0:02:32.42,0:02:34.16,Default,,0000,0000,0000,,不過有辦法 Dialogue: 0,0:02:34.16,0:02:37.39,Default,,0000,0000,0000,,讓外部程式碼讀取\N增高總量(totalInches) Dialogue: 0,0:02:37.68,0:02:42.65,Default,,0000,0000,0000,,關鍵是將此局部變數轉成總體變數 Dialogue: 0,0:02:42.78,0:02:47.20,Default,,0000,0000,0000,,只要在函數外定義即可 Dialogue: 0,0:02:47.46,0:02:50.35,Default,,0000,0000,0000,,也就是將此變數搬移到\N全作用域(global scope) Dialogue: 0,0:02:51.00,0:02:54.56,Default,,0000,0000,0000,,至於函數內要改的就是 Dialogue: 0,0:02:54.68,0:02:58.57,Default,,0000,0000,0000,,以每次計算取得新值\N而非透過定義或宣告 Dialogue: 0,0:02:58.76,0:03:02.55,Default,,0000,0000,0000,,目前顯示總增高值16\N(Total grown over life: 16) Dialogue: 0,0:03:02.85,0:03:06.52,Default,,0000,0000,0000,,所以轉換成總體變數後就能被讀取 Dialogue: 0,0:03:06.63,0:03:09.38,Default,,0000,0000,0000,,不過顯示值並非我們想要的 Dialogue: 0,0:03:09.63,0:03:11.27,Default,,0000,0000,0000,,這只是最新值而已 Dialogue: 0,0:03:11.48,0:03:13.55,Default,,0000,0000,0000,,因為每次呼叫此函數 Dialogue: 0,0:03:13.79,0:03:16.91,Default,,0000,0000,0000,,都會自動以當次運算結果為主 Dialogue: 0,0:03:18.30,0:03:20.48,Default,,0000,0000,0000,,但我們真正需要的是 Dialogue: 0,0:03:20.48,0:03:24.76,Default,,0000,0000,0000,,能加總所有數值的新變數 Dialogue: 0,0:03:24.76,0:03:28.96,Default,,0000,0000,0000,,也就是說\N能算出各年齡區間的總增高值 Dialogue: 0,0:03:29.33,0:03:32.56,Default,,0000,0000,0000,,所以先把增高總量(totalInches)\N改回局部變數 Dialogue: 0,0:03:33.43,0:03:38.04,Default,,0000,0000,0000,,再新增一個總體變數\N叫一生總增高值(lifeInches) Dialogue: 0,0:03:38.67,0:03:40.75,Default,,0000,0000,0000,,起始點設定為0 Dialogue: 0,0:03:41.09,0:03:45.24,Default,,0000,0000,0000,,在函數裡我們把數值\N加到這項總體變數 Dialogue: 0,0:03:45.42,0:03:49.78,Default,,0000,0000,0000,,終身英寸+=總增高值\N(lifeInches += totalInches) Dialogue: 0,0:03:50.01,0:03:51.89,Default,,0000,0000,0000,,之後每次呼叫此函數 Dialogue: 0,0:03:51.89,0:03:56.25,Default,,0000,0000,0000,,計算值便會新增到\N總體變數終身英寸(lifeInches) Dialogue: 0,0:03:56.32,0:04:00.06,Default,,0000,0000,0000,,並於最底下顯示結果\Ntext(lifeInches, 10, 200) Dialogue: 0,0:04:00.24,0:04:03.44,Default,,0000,0000,0000,,耶!總增高值就出來了! Dialogue: 0,0:04:03.61,0:04:06.46,Default,,0000,0000,0000,,不過這不是我目前身高\N實際上我更高 Dialogue: 0,0:04:06.46,0:04:07.42,Default,,0000,0000,0000,,不過這是因為 Dialogue: 0,0:04:07.45,0:04:10.30,Default,,0000,0000,0000,,人出生時身高大於0 Dialogue: 0,0:04:10.40,0:04:14.21,Default,,0000,0000,0000,,所以將起始值改成20來算總值 Dialogue: 0,0:04:14.27,0:04:16.52,Default,,0000,0000,0000,,所得就是我目前實際身高\N Dialogue: 0,0:04:17.05,0:04:18.74,Default,,0000,0000,0000,,好!再複習一次 Dialogue: 0,0:04:19.00,0:04:22.20,Default,,0000,0000,0000,,增高總量(totalInches)是局部變數 Dialogue: 0,0:04:22.20,0:04:23.39,Default,,0000,0000,0000,,因其宣告位置 Dialogue: 0,0:04:23.39,0:04:27.79,Default,,0000,0000,0000,,在函數內部,而非外部 Dialogue: 0,0:04:28.13,0:04:31.06,Default,,0000,0000,0000,,所以底下的程式碼 Dialogue: 0,0:04:31.25,0:04:34.58,Default,,0000,0000,0000,,無法判讀\N增高總量(totalInches)這項變數 Dialogue: 0,0:04:34.76,0:04:37.84,Default,,0000,0000,0000,,終身英寸(lifeInches)則是總體變數 Dialogue: 0,0:04:37.98,0:04:40.47,Default,,0000,0000,0000,,因其宣告位置在全作用域(global scope) Dialogue: 0,0:04:40.47,0:04:43.23,Default,,0000,0000,0000,,不在任何函數內 Dialogue: 0,0:04:43.41,0:04:45.31,Default,,0000,0000,0000,,編寫函數和變數時 Dialogue: 0,0:04:45.31,0:04:47.23,Default,,0000,0000,0000,,務必記住此規則 Dialogue: 0,0:04:47.23,0:04:48.28,Default,,0000,0000,0000,,請自問 Dialogue: 0,0:04:48.43,0:04:51.49,Default,,0000,0000,0000,,是想要只供函數內部用的\N局部變數(local variable) Dialogue: 0,0:04:51.63,0:04:54.49,Default,,0000,0000,0000,,還是整個程式通用的\N總體變數(global variable) Dialogue: 0,0:04:54.69,0:04:57.43,Default,,0000,0000,0000,,若你一時間覺得很難懂也不用擔心 Dialogue: 0,0:04:57.51,0:05:00.27,Default,,0000,0000,0000,,畢竟這本來就是\N程式語言中比較難的概念 Dialogue: 0,0:05:00.27,0:05:01.75,Default,,0000,0000,0000,,以Javascript語言來說就更複雜了 Dialogue: 0,0:05:01.89,0:05:04.48,Default,,0000,0000,0000,,但只要多練習就能上手了