vbs(asp) ByVal ByRef函數(shù)調(diào)用使用說明

字號:


    ByVal 傳送參數(shù)內(nèi)存的一個拷貝給被調(diào)用者。也就是說,棧中壓入的直接就是所傳的值。 ByRef 傳送參數(shù)內(nèi)存的實際地址給被調(diào)用者。也就是說,棧中壓入的是實際內(nèi)容的地址。被調(diào)用者可以直接更改該地址中的內(nèi)容。
    1、ByVal傳值:一種將參數(shù)值而不是將地址傳遞給過程的方式,這就使過程訪問到變量的復本。結(jié)果,過程不可改變變量的真正值。
    2、ByRef傳值:一種將參數(shù)地址而不是將值傳遞給過程的方式,這就使過程訪問到實際的變量。結(jié)果,過程可改變變量的真正值。除非另作說明,否則按地址傳遞參數(shù)。
    3、系統(tǒng)默認的是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>
    =======================
    結(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默認是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
    %>
    通過上面的例子你可以發(fā)現(xiàn):
    1、ByVal傳值沒有改變?nèi)肿兞康闹怠?BR>    2、ByRef傳值改變了全局變量的值。
    3、系統(tǒng)默認的是ByRef傳值。
    至于應該在什么時候使用嗎?這就要看自己的實際情況了!
    ByVal 傳送參數(shù)內(nèi)存的一個拷貝給被調(diào)用者。也就是說,棧中壓入的直接就是所傳的值。
    ByRef 傳送參數(shù)內(nèi)存的實際地址給被調(diào)用者。也就是說,棧中壓入的是實際內(nèi)容的地址。被調(diào)用者可以直接更改該地址中的內(nèi)容。
    ByVal是傳遞值 源數(shù)據(jù)不會被修改
    你可以把這個值當作自己的局部變量來使用
    ByRef是傳遞地址 , 源數(shù)據(jù)可能被修改
    你對這個變量的操作將對你傳入的那個變量產(chǎn)生影響,就像指針的感覺
    vb6的說明
    啥也不說了,接題:
    代碼如下:
    Function Test(a)
    a = a + 1
    End Function
    c = 1
    '------------------------------------
    '問題:
    ' 請說出分別調(diào)用下面四種方法的結(jié)果?
    '------------------------------------
    '方法一
    Test c
    '方法二
    'Test (c)
    '方法三
    'Test (c+1)
    '方法四
    'Call Test(c)
    msgbox c
    正確答案:分別為:2 , 1 , 1 , 2
    你全答對了沒?全答對了你可以直接Return了,沒答對的話繼續(xù)往下看。
    追溯
    幾乎所有編程語言的函數(shù)傳參都有傳值和傳引用之分,我們的VB老兄也不例外,而且,她選擇了傳引用作為其默認方式,甚者,她對所有變量類型不加挑剔,全部默認采用傳引用的方式,包括整型變量(int)。這也是華山論劍敗北的最根本原因。
    你可以在參數(shù)前使用ByVal(傳值)和ByRef(傳引用)關(guān)鍵字指明參數(shù)傳遞的方式:
    '傳值方式,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
    領(lǐng)悟
    通常,VB6的Function函數(shù)調(diào)用方法有兩種:
    Func Params
    如方法一:Test c
    Call Func(Params)
    如方法四:Call Test(c)
    因此,論劍中的方法一和方法四實質(zhì)上是一樣的,參數(shù)c都是通過默認的傳引用方式傳遞,執(zhí)行完函數(shù)Test后,c的值會隨之改變。因此方法一和方法四的結(jié)果為:2
    然而,江湖中似乎還流傳著這樣一種調(diào)用方法:
    Func(Expression)
    如方法二:Test(c) 和 方法三:Test(c+1)
    注 意到?jīng)]有,括號中的內(nèi)容不是Params,而是Expression,是一個表達式,而表達式的計算結(jié)果會被保存到一個臨時變量中傳入函數(shù)體,函數(shù)調(diào)用完畢 后臨時變量也隨之銷毀。因此,調(diào)用方法二時,表達式(c)的計算結(jié)果為1,保存到了一個臨時變量傳入函數(shù)Test中,函數(shù)執(zhí)行完成后,原來的c值并不發(fā)生 改變。同理,方法三的調(diào)用更加顯得直觀一些,(c+1)的表達式運算結(jié)果被保存到了一個臨時變量傳入Test,原來的c值并不發(fā)送改變。所以,方法二和方 法三的結(jié)果為:1
    出師
    總結(jié)如下:
    VB6和VBS中的函數(shù)參數(shù)默認是ByRef類型的。
    Test(c)方法調(diào)用時,VB會認為你傳遞的不是一個變量,而是一個表達式:(c) ,這個表達式運算結(jié)果,雖然與c值相同,但卻是保存在一個臨時變量中,這個臨時變量的改變不會影響到原來的變量c