热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vbs(asp)ByValByRef函数调用使用说明

1、byval传值:一种将参数值而不是将地址传递给过程的方式,这就使过程访问到变量的复本。结果,过程不可改变变量的真正值。 2、byref传值:一种将参数地址而不是将值传递给过程的

1、byval传值:一种将参数值而不是将地址传递给过程的方式,这就使过程访问到变量的复本。结果,过程不可改变变量的真正值。 
2、byref传值:一种将参数地址而不是将值传递给过程的方式,这就使过程访问到实际的变量。结果,过程可改变变量的真正值。除非另作说明,否则按地址传递参数。  
3、系统默认的是byref传值

例子:
代码如下:

=======================
结果:
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&"
"
call fun2 (i,j)
response.write i&"******"&j&"
"
i = 10
j = 12
call fun (i,j)
response.write i&"*******"&j&"
"
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



推荐阅读
  • 当使用 `new` 表达式(即通过 `new` 动态创建对象)时,会发生两件事:首先,内存被分配用于存储新对象;其次,该对象的构造函数被调用以初始化对象。为了确保资源管理的一致性和避免内存泄漏,建议在使用 `new` 和 `delete` 时保持形式一致。例如,如果使用 `new[]` 分配数组,则应使用 `delete[]` 来释放内存;同样,如果使用 `new` 分配单个对象,则应使用 `delete` 来释放内存。这种一致性有助于防止常见的编程错误,提高代码的健壮性和可维护性。 ... [详细]
  • 本文介绍了如何在Spring框架中使用AspectJ实现AOP编程,重点讲解了通过注解配置切面的方法,包括方法执行前和方法执行后的增强处理。阅读本文前,请确保已安装并配置好AspectJ。 ... [详细]
  • PHP 5.5.31 和 PHP 5.6.17 安全更新发布
    PHP 5.5.31 和 PHP 5.6.17 已正式发布,主要包含多个安全修复。强烈建议所有用户尽快升级至最新版本以确保系统安全。 ... [详细]
  • 本文介绍了如何在Python中使用插值方法将不同分辨率的数据统一到相同的分辨率。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 小程序的授权和登陆
    小程序的授权和登陆 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
author-avatar
dmcm0011
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有