如何在vbs中使用ByVal和ByRef函數(shù)-創(chuàng)新互聯(lián)

如何在vbs中使用ByVal和ByRef函數(shù)?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

成都創(chuàng)新互聯(lián)專注于中大型企業(yè)的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)和網(wǎng)站改版、網(wǎng)站營銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計(jì)客戶上1000家,服務(wù)滿意度達(dá)97%。幫助廣大客戶順利對(duì)接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運(yùn)用,我們將一直專注品牌網(wǎng)站設(shè)計(jì)和互聯(lián)網(wǎng)程序開發(fā),在前進(jìn)的路上,與客戶一起成長!

1、ByVal傳值:一種將參數(shù)值而不是將地址傳遞給過程的方式,這就使過程訪問到變量的復(fù)本。結(jié)果,過程不可改變變量的真正值。 
2、ByRef傳值:一種將參數(shù)地址而不是將值傳遞給過程的方式,這就使過程訪問到實(shí)際的變量。結(jié)果,過程可改變變量的真正值。除非另作說明,否則按地址傳遞參數(shù)。  
3、系統(tǒng)默認(rèn)的是ByRef傳值。

例子:


復(fù)制代碼 代碼如下:


<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>



=======================
結(jié)果:
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默認(rèn)是byRef,這點(diǎn)和VB一樣, 按地址。

再給出一個(gè)小例子,大家運(yùn)行看效果!


復(fù)制代碼 代碼如下:


<%
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
%>



通過上面的例子你可以發(fā)現(xiàn):
1、ByVal傳值沒有改變?nèi)肿兞康闹怠?br/>2、ByRef傳值改變了全局變量的值。
3、系統(tǒng)默認(rèn)的是ByRef傳值。

至于應(yīng)該在什么時(shí)候使用嗎?這就要看自己的實(shí)際情況了!

ByVal 傳送參數(shù)內(nèi)存的一個(gè)拷貝給被調(diào)用者。也就是說,棧中壓入的直接就是所傳的值。
ByRef 傳送參數(shù)內(nèi)存的實(shí)際地址給被調(diào)用者。也就是說,棧中壓入的是實(shí)際內(nèi)容的地址。被調(diào)用者可以直接更改該地址中的內(nèi)容。
ByVal是傳遞值 源數(shù)據(jù)不會(huì)被修改
你可以把這個(gè)值當(dāng)作自己的局部變量來使用
ByRef是傳遞地址 , 源數(shù)據(jù)可能被修改
你對(duì)這個(gè)變量的操作將對(duì)你傳入的那個(gè)變量產(chǎn)生影響,就像指針的感覺


vb6的說明
啥也不說了,接題:


復(fù)制代碼 代碼如下:


Function Test(a)
a = a + 1
End Function

c = 1
'------------------------------------
'問題:
' 請(qǐng)說出分別調(diào)用下面四種方法的結(jié)果?
'------------------------------------
'方法一
Test c

'方法二
'Test (c)

'方法三
'Test (c+1)

'方法四
'Call Test(c)

msgbox c



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

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

'傳值方式,c值不變


復(fù)制代碼 代碼如下:


Function Test(ByVal a)
a = a + 1
End Function
c = 1
Test c
'c = 1



'傳值方式,c值不變


復(fù)制代碼 代碼如下:


Function Test(ByRef a)
a = a + 1
End Function
c = 1
Test c
'c = 2



領(lǐng)悟
通常,VB6的Function函數(shù)調(diào)用方法有兩種:
Func Params
如方法一:Test c

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


因此,論劍中的方法一和方法四實(shí)質(zhì)上是一樣的,參數(shù)c都是通過默認(rèn)的傳引用方式傳遞,執(zhí)行完函數(shù)Test后,c的值會(huì)隨之改變。因此方法一和方法四的結(jié)果為:2
然而,江湖中似乎還流傳著這樣一種調(diào)用方法:


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

注 意到?jīng)]有,括號(hào)中的內(nèi)容不是Params,而是Expression,是一個(gè)表達(dá)式,而表達(dá)式的計(jì)算結(jié)果會(huì)被保存到一個(gè)臨時(shí)變量中傳入函數(shù)體,函數(shù)調(diào)用完畢 后臨時(shí)變量也隨之銷毀。因此,調(diào)用方法二時(shí),表達(dá)式(c)的計(jì)算結(jié)果為1,保存到了一個(gè)臨時(shí)變量傳入函數(shù)Test中,函數(shù)執(zhí)行完成后,原來的c值并不發(fā)生 改變。同理,方法三的調(diào)用更加顯得直觀一些,(c+1)的表達(dá)式運(yùn)算結(jié)果被保存到了一個(gè)臨時(shí)變量傳入Test,原來的c值并不發(fā)送改變。所以,方法二和方 法三的結(jié)果為:1
總結(jié)如下:
VB6和VBS中的函數(shù)參數(shù)默認(rèn)是ByRef類型的。

Test(c)方法調(diào)用時(shí),VB會(huì)認(rèn)為你傳遞的不是一個(gè)變量,而是一個(gè)表達(dá)式:(c) ,這個(gè)表達(dá)式運(yùn)算結(jié)果,雖然與c值相同,但卻是保存在一個(gè)臨時(shí)變量中,這個(gè)臨時(shí)變量的改變不會(huì)影響到原來的變量c


關(guān)于如何在vbs中使用ByVal和ByRef函數(shù)問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

文章題目:如何在vbs中使用ByVal和ByRef函數(shù)-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://www.muchs.cn/article28/djhjcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站服務(wù)器托管、微信公眾號(hào)、標(biāo)簽優(yōu)化、電子商務(wù)自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營