当前位置: 首页 > 图文教程 > 脚本技术 > VBScript > VB6 ByVal ByRef函数调用

VBScript
NYboy.vbs病毒源代码公布,我来模拟熊猫烧香
vbs脚本病毒生成器 下载
用vbs实现返回 IP 配置数据
mdir.vbs 建立隐藏虚拟目录的vbs
改进后的mkw3site.vbs(创建虚拟目录)
charCodeAt与AscW函数的区别说明
vbs中Empty和Null的区别
用vbs将名称转换为正确的大小写的代码
用vbs实现更改计算机的说明的代码
vbs中使用 ADO 读取所有数据均在一行上的文本文件的代码
用vbs检测Internet Explorer 中是否启用了 ActiveX
在vbs运行命令行工具后让命令窗口保持打开状态的脚本
用vbs读取远程计算机上的文本文件的代码
用vbs从本地 Administrators 组中删除组
用vbs删除前一天创建的备份文件
不错的一篇VBS-JSCRIPT GETOBJECT理解
VBS ArrayList Class vbs中的数组类
如何调试JScript/VBScript的方法
如何通过计划任务调用QuickTest测试脚本
用vbs实现按创建日期的顺序列出一个文件夹中的所有文件

VBScript 中的 VB6 ByVal ByRef函数调用


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-11   浏览: 134 ::
收藏到网摘: n/a

啥也不说了,接题:
复制代码 代码如下:

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