vbs(asp) ByVal ByRef函數調用使用說明

來源:互聯網
上載者:User

1、ByVal傳值:一種將參數值而不是將地址傳遞給過程的方式,這就使過程訪問到變數的複本。結果,過程不可改變變數的真正值。
2、ByRef傳值:一種將參數地址而不是將值傳遞給過程的方式,這就使過程訪問到實際的變數。結果,過程可改變變數的真正值。除非另作說明,否則按地址傳遞參數。
3、系統預設的是ByRef傳值。

例子:

複製代碼 代碼如下:<SCRIPT LANGUAGE="vbScript">
dim a
a=0
document.write "a=0"
document.write "<br/>sub change(byref ar)<br/>"
change a
document.write a
a=0
document.write "<br/>sub change2(ByVal ar)<br/>"
change2 a
document.write a
a=0
document.write "<br/>sub change3( ar)<br/>"
change3 a
document.write a
a=0
document.write "<br/>function change4(byref ar)<br/>"
change4 a
document.write a
a=0
document.write "<br/>function change5(ByVal ar)<br/>"
change5 a
document.write a
a=0
document.write "<br/>function change6( ar)<br/>"
change6 a
document.write a
a=0
sub change(byref ar)
ar=111
end sub
sub change2(ByVal ar)
ar=222
end sub
sub change3( ar)
ar=333
end sub
function change4(byref ar)
ar=444
end function
function change5(ByVal ar)
ar=555
end function
function change6( ar)
ar=666
end function
</SCRIPT>

=======================
結果:
a=0
sub change(byref ar)
111
sub change2(ByVal ar)
0
sub change3( ar)
333
function change4(byref ar)
444
function change5(ByVal ar)
0
function change6( ar)
666
說明vbs預設是byRef,這點和VB一樣, 按地址。

再給出一個小例子,大家運行看效果! 複製代碼 代碼如下:<%
Dim i,j,p,m
i = 10
j = 12
Response.Write i&"******"&j&"<br>"
Call Fun2 (i,j)
Response.Write i&"******"&j&"<br>"
i = 10
j = 12
Call Fun (i,j)
Response.Write i&"*******"&j&"<br>"
Function Fun2 (a,b)
a = 5
b = 6
Fun2 = 0
End Function
Function Fun (ByVal a,ByRef b)
a = 5
b = 6
Fun = 0
End Function
%>

通過上面的例子你可以發現:
1、ByVal傳值沒有改變全域變數的值。
2、ByRef傳值改變了全域變數的值。
3、系統預設的是ByRef傳值。

至於應該在什麼時候使用嗎?這就要看自己的實際情況了!

ByVal 傳送參數記憶體的一個拷貝給被調用者。也就是說,棧中壓入的直接就是所傳的值。
ByRef 傳送參數記憶體的實際地址給被調用者。也就是說,棧中壓入的是實際內容的地址。被調用者可以直接更改該地址中的內容。
ByVal是傳遞值 來源資料不會被修改
你可以把這個值當作自己的局部變數來使用
ByRef是傳遞地址 , 來源資料可能被修改
你對這個變數的操作將對你傳入的那個變數產生影響,就像指標的感覺

vb6的說明
啥也不說了,接題: 複製代碼 代碼如下:Function Test(a)
a = a + 1
End Function

c = 1
'------------------------------------
'問題:
' 請說出分別調用下面四種方法的結果?
'------------------------------------
'方法一
Test c

'方法二
'Test (c)

'方法三
'Test (c+1)

'方法四
'Call Test(c)

msgbox c

正確答案:分別為:2 , 1 , 1 , 2
你全答對了沒?全答對了你可以直接Return了,沒答對的話繼續往下看。

追溯
幾乎所有程式設計語言的函數傳參都有傳值和傳引用之分,我們的VB老兄也不例外,而且,她選擇了傳引用作為其預設,甚者,她對所有變數類型不加挑剔,全部預設採用傳引用的方式,包括整型變數(int)。這也是華山論劍敗北的最根本原因。
你可以在參數前使用ByVal(傳值)和ByRef(傳引用)關鍵字指明參數傳遞的方式:

'傳值方式,c值不變 複製代碼 代碼如下:Function Test(ByVal a)
a = a + 1
End Function
c = 1
Test c
'c = 1

'傳值方式,c值不變 複製代碼 代碼如下:Function Test(ByRef a)
a = a + 1
End Function
c = 1
Test c
'c = 2

領悟
通常,VB6的Function函數調用方法有兩種:
Func Params
如方法一:Test c

Call Func(Params)
如方法四:Call Test(c)

因此,論劍中的方法一和方法四實質上是一樣的,參數c都是通過預設的傳引用方式傳遞,執行完函數Test後,c的值會隨之改變。因此方法一和方法四的結果為:2
然而,江湖中似乎還流傳著這樣一種調用方法:

Func(Expression)
如方法二:Test(c) 和 方法三:Test(c+1)

注 意到沒有,括弧中的內容不是Params,而是Expression,是一個運算式,而運算式的計算結果會被儲存到一個臨時變數中傳入函數體,函數調用完畢 後臨時變數也隨之銷毀。因此,調用方法二時,運算式(c)的計算結果為1,儲存到了一個臨時變數傳入函數Test中,函數執行完成後,原來的c值並不發生 改變。同理,方法三的調用更加顯得直觀一些,(c+1)的運算式運算結果被儲存到了一個臨時變數傳入Test,原來的c值並不發送改變。所以,方法二和方 法三的結果為:1

出師
總結如下:
VB6和VBS中的函數參數預設是ByRef類型的。

Test(c)方法調用時,VB會認為你傳遞的不是一個變數,而是一個運算式:(c) ,這個運算式運算結果,雖然與c值相同,但卻是儲存在一個臨時變數中,這個臨時變數的改變不會影響到原來的變數c

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.