函數的基本概念大家應很熟了
不過接下來的內容比較複雜
我要談局部和總體變數的差異
目前各位可能還不懂這兩個概念
所以我們先看個例子
我寫了一個能顯示 我童年時身高變化的程式
每個人長高速率不同
所以我設計了 身高變化計算函數(calcInches)
我傳入起始年齡(startAge) 和終止年齡(endAge)
及年增高值 (inchesPerYear)
便能算出童年時期
總共長高幾寸
再將數值傳遞給呼叫的函數
從0到8歲(from 0-8 years)這條開始
我先呼叫身高變化計算函數 並傳遞0、8和2.5這些值
2.5代表我當時 每年平均長高2.5英寸
運算後得到20這個值
接著在8到16歲(From 8-16 years) 這裡輸入8、16和 2
這期間我沒什麼長高 運算後跑出16
目前為止都很好 但我想指定程式顯示
我童年時一共增高多少？
要怎麼做呢？ 首先得先檢視程式碼
想想函數包含了哪些值
有沒有能代表增高總量的值？
身高變化計算函數裡確實有 增高總量變數(totalInches)
將這個變數輸出，看看結果如何？
在文字末尾輸入本文(text) (totalInches, 10, 200)
好了，試一下
糟糕！出現錯誤訊息
提醒我們
增高總量(totalInches)尚未定義
不可能啊！我們才定義過
就在這裡: var totalInches =
問題癥結在於
增高總量(totalInches) 是在函數內進行宣告
當你在函數內宣告任何變數
此變數會被視為局部變數
只有在身高變化計算函數內有效
函數外的程式碼
看不到函數內的局部變數
只能辨識回傳內容
也就是只讀取回傳值 看不到變數
所以在函數外用增高總量(totalInches)
程式碼是無法辨識的
會跳出錯誤： 「喂，我沒見過這個變數
定義不明，我無法顯示」
不過有辦法
讓外部程式碼讀取 增高總量(totalInches)
關鍵是將此局部變數轉成總體變數
只要在函數外定義即可
也就是將此變數搬移到 全作用域(global scope)
至於函數內要改的就是
以每次計算取得新值 而非透過定義或宣告
目前顯示總增高值16 (Total grown over life: 16)
所以轉換成總體變數後就能被讀取
不過顯示值並非我們想要的
這只是最新值而已
因為每次呼叫此函數
都會自動以當次運算結果為主
但我們真正需要的是
能加總所有數值的新變數
也就是說 能算出各年齡區間的總增高值
所以先把增高總量(totalInches) 改回局部變數
再新增一個總體變數 叫一生總增高值(lifeInches)
起始點設定為0
在函數裡我們把數值 加到這項總體變數
終身英寸+=總增高值 (lifeInches += totalInches)
之後每次呼叫此函數
計算值便會新增到 總體變數終身英寸(lifeInches)
並於最底下顯示結果 text(lifeInches, 10, 200)
耶！總增高值就出來了！
不過這不是我目前身高 實際上我更高
不過這是因為
人出生時身高大於0
所以將起始值改成20來算總值
所得就是我目前實際身高
好！再複習一次
增高總量(totalInches)是局部變數
因其宣告位置
在函數內部，而非外部
所以底下的程式碼
無法判讀 增高總量(totalInches)這項變數
終身英寸(lifeInches)則是總體變數
因其宣告位置在全作用域(global scope)
不在任何函數內
編寫函數和變數時
務必記住此規則
請自問
是想要只供函數內部用的 局部變數(local variable)
還是整個程式通用的 總體變數(global variable)
若你一時間覺得很難懂也不用擔心
畢竟這本來就是 程式語言中比較難的概念
以Javascript語言來說就更複雜了
但只要多練習就能上手了