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

VBScript
vbs 列出该目录下所有文件和文件夹的类型,大小,和所有者
雷客图 站长安全助手 vbs版代码(asp 木马查找)
discuz 任意管理员密码漏洞利用工具 vbs代码
添加网站到安全站点.设置安全站点打开ActiveX时提示.去页眉页脚的vbs代码
文件夹定时自动备份 AutoBackUpFolder.vbs
iis PHP安装脚本 PHPInstall.vbs V3.1
HTA文件去除html控件认证和接收命令行参数
vbs 更改环境变量
excel2access vbs脚本
VBS 下载方法(CDO.MESSAGE)
vbs实现myipneighbors 域名查询结果整理
修改 Gateway和DNS的vbs脚本
VBS sendkeys 模拟击键操作 问题解决
用vbscript来添加ip策略 自动封IP
vbs,hta中选择文件夹对话框实现代码
WMI 脚本高手不完全手册
vbscript语句中“&H”专用于16进制数表示
URL 筛选小工具 提取网页中的链接地址
VBScript 文件操作代码小结
vbs 错误捕获器,用于捕获内部错误并进行手工处理

VBScript 中的 VB6 ByVal ByRef函数调用


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-11   浏览: 123 ::
收藏到网摘: 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