Return to Video

局部和總體變數(影音版)

  • 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:48
    2.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
    但只要多練習就能上手了
Title:
局部和總體變數(影音版)
Description:

本影片為實作影片講解剪輯,目的為便於字幕製作與翻譯。更完整的影片目錄請見
https://www.khanacademy.org/cs/programming/

more » « less
Video Language:
English
Duration:
05:06

Chinese, Traditional subtitles

Revisions