1. 程式人生 > 其它 >VBS指令碼程式設計(5)——過程與函式

VBS指令碼程式設計(5)——過程與函式

過程是構成程式的一個模組,往往用來完成一個相對獨立的功能。過程可以使程式更清。 Sub過程與Function函式的區別: Sub沒有返回值,Function有返回值; Sub不能放在表示式中,Function可以放在表示式中。

宣告過程

——Sub 語句

宣告 Sub 過程的名稱、引數以及構成其主體的程式碼。 [Public [Default] | Private] Sub name [(arglist)] [statements] [Exit Sub] [statements] End Sub 引數 Public 表示 Sub 過程可被所有指令碼中的所有其他過程訪問。 Default
只與 塊中的Public 關鍵字連用,用來表示 Sub 過程是類的預設方法。如果在類中指定了不止一個Default過程,就會出錯。 Private 表示 Sub 過程只可被宣告該過程的指令碼中的其他過程訪問。 name Sub 的名稱,遵循標準變數命名規則。 arglist 代表在呼叫時要傳遞給 Sub 過程的引數的變數列表。用逗號隔開多個變數。 statementsSub 過程主體內所執行的任何語句組。 arglist 引數包含下列語法和部分: [ByVal | ByRef] varname[( )] 引數 ByVal 表示該引數是按值傳遞的。 ByRef 表示該引數按引用傳遞。預設按引用傳遞。 varname
代表引數的變數名稱,遵循標準變數命名規則。 說明 如沒有顯式地指定使用 Public 或 Private,則 Sub 過程預設為公用,即它們對於指令碼中的所有其他過程都是可見的。Sub 過程中區域性變數的值在呼叫過程中不被保留。 不能在任何其他過程(例如,FunctionProperty Get)中定義 Sub 過程。 使用 Exit Sub 語句可以立即從 Sub 過程中退出。程式繼續執行呼叫 Sub 過程的語句之後的語句。可以在 Sub 過程中任意位置出現任意個 Exit Sub 語句。 與 Function 過程相似之處是:Sub 過程是一個可以獲取引數,執行一系列語句以及可改變其引數的值的獨立過程。而與 Function
過程不同之處是:Function 過程可以返回值,而 Sub 過程不能用於表示式中。 可以使用過程名並跟隨相應的引數列表來呼叫 Sub 過程。關於如何呼叫 Sub 過程的詳細說明資訊,請參閱 Call 語句。
警告Sub 過程可以是遞迴的,即該過程可以呼叫自己來完成某個給定的任務。但是遞迴可能會導致堆疊溢位。 在 Sub 過程中使用的變數分為兩類:一類是在過程內顯式宣告的,另一類則不是。在過程內顯式宣告的變數(使用 Dim 或等效方法)總是區域性變數。對於那些沒有在過程中顯式宣告的變數也是區域性的,除非在該過程外更高級別的位置顯式地宣告它們。 警告過程可以使用沒有在過程內顯式宣告的變數,但只要有任何 script 級定義的名稱與之同名,就會產生名稱衝突。如果過程中引用的未宣告的變數與其他的過程、常數或變數的名稱相同,則會認為過程引用的是指令碼級的名稱。要避免這類衝突,請使用 Option Explicit 語句可強制顯式宣告變數。

過程的呼叫及退出

——Call 語句

將控制權傳遞給 SubFunction 過程。 [Call] name [argumentlist] 引數 Call 可選項關鍵字。如果指定此關鍵字,則必須用括號把 argumentlist 括起來。例如: Call MyProc(0) name 必選項。要呼叫的過程名。 argumentlist 可選項。傳遞給過程的變數、陣列或表示式列表,用逗號分隔每一項。 說明 在呼叫過程時,不必使用 Call 關鍵字。然而,如果使用 Call 關鍵字呼叫要求引數的過程,則必須用括號將 argumentlist 括起來。如果省略 Call 關鍵字,那麼必須也同時省略 argumentlist 引數兩邊的括號。使用 Call 語法呼叫內部函式或使用使用者自定義函式,函式返回值都會被放棄。 例、
Dim input
Sub ConvertTemp(name)
       MsgBox("你好"&name)
	End Sub
input = InputBox("請輸入姓名")
call ConvertTemp(input)

宣告函式

——Function語句

宣告 Function 過程的名稱、引數以及構成其主體的程式碼。

[Public [Default]| Private] Function name [( arglist )] [statements] [name = expression] [Exit Function] [statements] [name = expression] End Function 引數 Public 表示 Function 過程可被所有指令碼中的所有其他過程訪問。 Default 只與 Class 塊中的 Public 關鍵字一起使用來表示 Function 過程是類的預設方法。如果在一個類中指定了不止一個 Default 過程,就有錯誤發生。 Private 表示 Function 過程只可被宣告它的指令碼中的其他過程訪問或者如果函式是一個數據類,那麼 Function 過程只能被該類中的其他過程訪問。 name Function 的名稱,遵循標準的變數命名規則。 arglist 代表呼叫時要傳遞給 Function 過程的引數的變數列表。用逗號隔開多個變數。 statementsFunction 過程的主體中執行的任意語句組。 expression Function 的返回值。 arglist 引數包含下列語法和部分: [ByVal | ByRef] varname[( )] 引數 ByVal 表示該引數是按值方式傳遞的。 ByRef 表示該引數按引用方式傳遞。 varname 代表引數變數的名稱;遵循標準的變數命名規則。 說明 如沒有顯式指定使用 Public 或 Private,則 Function 過程預設為公用,即它們對於指令碼中的所有其他過程是可見的。Function 中區域性變數的值在對過程的呼叫中不被保留。 不能在任何其他過程(例如,SubProperty Get)中定義 Function 過程。 使用 Exit Function 語句可以從 Function 過程中立即退出。程式繼續執行呼叫 Function 過程的語句之後的語句。可在 Function 過程的任何位置出現任意個 Exit Function 語句。 與 Sub 過程類似,Function 過程是可以獲取引數、執行一系列語句並改變其引數值的獨立過程。與 Sub 過程的不同之處是:當要使用由函式返回的值時,可以在表示式的右邊使用 Function 過程,這與內部函式的使用方式一樣,例如 SqrCosChr。 在表示式中,可以通過使用函式名,並在其後用圓括號給出相應的引數列表來呼叫 Function 過程。有關呼叫 Function 過程的詳細資訊,請參閱 Call 語句。 警告Function 過程可以是遞迴的,即該過程可以呼叫自身以完成某個給定的任務。但是,遞迴可能會導致堆疊溢位。 要從函式返回一個值,只需將值賦給函式名。在過程的任意位置都可以出現任意個這樣的賦值。如果沒有給 name 賦值, 則過程將返回一個預設值:數值函式返回 0,字串函式返回零長度字串 ("")。如果在 Function 中沒有物件引用被指定給 name(使用 Set),則返回物件引用的函式將返回 Nothing。 在 Function 過程中使用的變數分為兩類:一類是在過程內顯式宣告的,另一類則不是。在過程內顯式宣告的變數(使用 Dim 或等效方法)總是過程的區域性變數。被使用但沒有在過程中顯式宣告的變數也是區域性變數,除非在該過程外更高級別的位置顯式宣告它們。 警告過程可以使用沒有在過程內顯式宣告的變數,但只要有任何 script 級定義的名稱與之同名,就會產生名稱衝突。如果過程中引用的未宣告的變數與其他的過程、常數或變數的名稱相同,則會認為過程引用的是指令碼級的名稱。要避免這類衝突,請使用 Option Explicit 語句可強制顯式宣告變數。 警告VBScript 可能會重新排列數學表示式以提高內部效率。當 Function 過程修改數學表示式中變數的值時,應避免在同一表示式中使用該函式。 例、利用遞迴演算法定義一個計算斐波那契數列的函式
Function MyArray(a)
	If a = 1 Then MyArray = 1
	If a = 2 Then MyArray = 1
	If a > 2 Then MyArray = MyArray(a-1) + MyArray(a-2)	
	End Function
Dim input
input = InputBox("請輸入第幾項","斐波那契數列")
MsgBox MyArray(input)