局部和總體變數(影音版)
-
0:01 - 0:03函數的基本概念大家應很熟了
-
0:03 - 0:07不過接下來的內容比較複雜
-
0:08 - 0:11我要談局部和總體變數的差異
-
0:12 - 0:14目前各位可能還不懂這兩個概念
-
0:14 - 0:16所以我們先看個例子
-
0:17 - 0:20我寫了一個能顯示
我童年時身高變化的程式 -
0:20 - 0:22每個人長高速率不同
-
0:22 - 0:25所以我設計了
身高變化計算函數(calcInches) -
0:25 - 0:28我傳入起始年齡(startAge)
和終止年齡(endAge) -
0:28 - 0:30及年增高值 (inchesPerYear)
-
0:30 - 0:32便能算出童年時期
-
0:32 - 0:34總共長高幾寸
-
0:35 - 0:37再將數值傳遞給呼叫的函數
-
0:37 - 0:41從0到8歲(from 0-8 years)這條開始
-
0:41 - 0:45我先呼叫身高變化計算函數
並傳遞0、8和2.5這些值 -
0:45 - 0:482.5代表我當時
每年平均長高2.5英寸 -
0:49 - 0:52運算後得到20這個值
-
0:52 - 0:58接著在8到16歲(From 8-16 years)
這裡輸入8、16和 2 -
0:58 - 1:01這期間我沒什麼長高
運算後跑出16 -
1:02 - 1:05目前為止都很好
但我想指定程式顯示 -
1:05 - 1:08我童年時一共增高多少?
-
1:09 - 1:15要怎麼做呢?
首先得先檢視程式碼 -
1:15 - 1:17想想函數包含了哪些值
-
1:17 - 1:21有沒有能代表增高總量的值?
-
1:21 - 1:26身高變化計算函數裡確實有
增高總量變數(totalInches) -
1:26 - 1:30將這個變數輸出,看看結果如何?
-
1:31 - 1:35在文字末尾輸入本文(text)
(totalInches, 10, 200) -
1:36 - 1:38好了,試一下
-
1:38 - 1:41糟糕!出現錯誤訊息
-
1:41 - 1:43提醒我們
-
1:43 - 1:46增高總量(totalInches)尚未定義
-
1:46 - 1:49不可能啊!我們才定義過
-
1:49 - 1:52就在這裡: var totalInches =
-
1:53 - 1:54問題癥結在於
-
1:54 - 1:59增高總量(totalInches)
是在函數內進行宣告 -
2:00 - 2:02當你在函數內宣告任何變數
-
2:02 - 2:04此變數會被視為局部變數
-
2:05 - 2:09只有在身高變化計算函數內有效
-
2:09 - 2:12函數外的程式碼
-
2:12 - 2:16看不到函數內的局部變數
-
2:16 - 2:18只能辨識回傳內容
-
2:18 - 2:21也就是只讀取回傳值
看不到變數 -
2:22 - 2:25所以在函數外用增高總量(totalInches)
-
2:25 - 2:26程式碼是無法辨識的
-
2:26 - 2:29會跳出錯誤:
「喂,我沒見過這個變數 -
2:29 - 2:31定義不明,我無法顯示」
-
2:32 - 2:34不過有辦法
-
2:34 - 2:37讓外部程式碼讀取
增高總量(totalInches) -
2:38 - 2:43關鍵是將此局部變數轉成總體變數
-
2:43 - 2:47只要在函數外定義即可
-
2:47 - 2:50也就是將此變數搬移到
全作用域(global scope) -
2:51 - 2:55至於函數內要改的就是
-
2:55 - 2:59以每次計算取得新值
而非透過定義或宣告 -
2:59 - 3:03目前顯示總增高值16
(Total grown over life: 16) -
3:03 - 3:07所以轉換成總體變數後就能被讀取
-
3:07 - 3:09不過顯示值並非我們想要的
-
3:10 - 3:11這只是最新值而已
-
3:11 - 3:14因為每次呼叫此函數
-
3:14 - 3:17都會自動以當次運算結果為主
-
3:18 - 3:20但我們真正需要的是
-
3:20 - 3:25能加總所有數值的新變數
-
3:25 - 3:29也就是說
能算出各年齡區間的總增高值 -
3:29 - 3:33所以先把增高總量(totalInches)
改回局部變數 -
3:33 - 3:38再新增一個總體變數
叫一生總增高值(lifeInches) -
3:39 - 3:41起始點設定為0
-
3:41 - 3:45在函數裡我們把數值
加到這項總體變數 -
3:45 - 3:50終身英寸+=總增高值
(lifeInches += totalInches) -
3:50 - 3:52之後每次呼叫此函數
-
3:52 - 3:56計算值便會新增到
總體變數終身英寸(lifeInches) -
3:56 - 4:00並於最底下顯示結果
text(lifeInches, 10, 200) -
4:00 - 4:03耶!總增高值就出來了!
-
4:04 - 4:06不過這不是我目前身高
實際上我更高 -
4:06 - 4:07不過這是因為
-
4:07 - 4:10人出生時身高大於0
-
4:10 - 4:14所以將起始值改成20來算總值
-
4:14 - 4:17所得就是我目前實際身高
-
4:17 - 4:19好!再複習一次
-
4:19 - 4:22增高總量(totalInches)是局部變數
-
4:22 - 4:23因其宣告位置
-
4:23 - 4:28在函數內部,而非外部
-
4:28 - 4:31所以底下的程式碼
-
4:31 - 4:35無法判讀
增高總量(totalInches)這項變數 -
4:35 - 4:38終身英寸(lifeInches)則是總體變數
-
4:38 - 4:40因其宣告位置在全作用域(global scope)
-
4:40 - 4:43不在任何函數內
-
4:43 - 4:45編寫函數和變數時
-
4:45 - 4:47務必記住此規則
-
4:47 - 4:48請自問
-
4:48 - 4:51是想要只供函數內部用的
局部變數(local variable) -
4:52 - 4:54還是整個程式通用的
總體變數(global variable) -
4:55 - 4:57若你一時間覺得很難懂也不用擔心
-
4:58 - 5:00畢竟這本來就是
程式語言中比較難的概念 -
5:00 - 5:02以Javascript語言來說就更複雜了
-
5:02 - 5:04但只要多練習就能上手了
![]() |
chen_kel edited Chinese, Traditional subtitles for Local and Global Variables (Video Version) | |
![]() |
Samson Zhong edited Chinese, Traditional subtitles for Local and Global Variables (Video Version) | |
![]() |
Samson Zhong edited Chinese, Traditional subtitles for Local and Global Variables (Video Version) | |
![]() |
Samson Zhong edited Chinese, Traditional subtitles for Local and Global Variables (Video Version) | |
![]() |
Samson Zhong edited Chinese, Traditional subtitles for Local and Global Variables (Video Version) | |
![]() |
Samson Zhong edited Chinese, Traditional subtitles for Local and Global Variables (Video Version) | |
![]() |
Samson Zhong edited Chinese, Traditional subtitles for Local and Global Variables (Video Version) | |
![]() |
Samson Zhong edited Chinese, Traditional subtitles for Local and Global Variables (Video Version) |