vbs(asp) ByVal ByRef函数调用使用说明

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

=======================
结果:
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
%>

通过上面的例子你可以发现:
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

时间: 2008-09-05

关于 byval 与 byref 的区别分析总结

二者区别: byval 传递数值,实参和形参分处不同的内存单元,互不干扰!  byref 传递地址,实参和形参占用相同的内存单元,形参变则实参变!!!!!! 通俗理解: byval 一去不复返  byref 进去再出来,可能被更新!在JavaScript中: Boolean,Number,String型的参数是按值传递的 ==> 相当于VBS中的ByVal; 而Object型的参数(包括JS对象,Array对象,Function对象等),是按引用传递 ==> 相当于VBS中的ByRef 复制代

ByVal和ByRef(编写ASP子程序所用到命令)

ByVal 传送参数内存的一个拷贝给被调用者.也就是说,栈中压入的直接就是所传的值. ByRef 传送参数内存的实际地址给被调用者.也就是说,栈中压入的是实际内容的地址.被调用者可以直接更改该地址中的内容. ByVal是传递值 源数据不会被修改 你可以把这个值当作自己的局部变量来使用 ByRef是传递地址 , 源数据可能被修改 你对这个变量的操作将对你传入的那个变量产生影响,就像指针的感觉 实例: 复制代码 代码如下: sub Add1(ByVal no as int32)     no=no+

JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享

对于"JavaScript 函数参数是传值(byVal)还是传址(byRef)"这个问题,普遍存在一个误区:number,string等"简单类型"是传值,Number, String, Object, Array等"复杂类型"是传址.这样不对吗?为什么会有这样的误区?看一下这两段代码: 复制代码 代码如下: //造成传值假象的代码function modifyLikeByVal(x){  x = 1;  console.log('x = %d'

Asp中通过简单的例子理解下ByVal和ByRef的用法

文件名称: ByVal.asp ByRef.asp 具体代码: <%Sub TestMain()Dim A : A=5Call TestBy(A)Response.write AEnd SubSub TestBy(ByVal T)T=T+1End subcall TestMain()%> <%Sub TestMain()Dim A : A=5Call TestBy(A)Response.write AEnd SubSub TestBy(ByRef T)T=T+1End subcall T

asp中Byval与Byref的区别

文件名称: ByVal.asp ByRef.asp 具体代码: <%Sub TestMain()Dim A : A=5Call TestBy(A)Response.write AEnd SubSub TestBy(ByVal T)T=T+1End subcall TestMain()%> <%Sub TestMain()Dim A : A=5Call TestBy(A)Response.write AEnd SubSub TestBy(ByRef T)T=T+1End subcall T

.Net 下区别使用 ByRef/ByVal 的重要性 分享

一直以来在 VB6 下,参数默认都是按照 ByRef  传送的,(即按地址传送) 而在 .Net(C#,VB.Net) 下, 参数默认是使用 ByVal (即按值传送)  传送的,一直没怎么注意.这些天在优化程序时发现 当传送 大变量时,使用默认方式(ByVal) 效率相当低如传入的参数变量类型 是 大字符串,数组,集合,DataSet 等测试的关键代码如下,我传入的字符串并没有特别大,变量越大,使用 ByRef 效率越高,当然,当传入得变量可以被修改或无其他作用时,可以改用 ByRef 传 复

linux下命令行操作快捷键及技巧(分享)

历史相关命令 !!:执行上一条命令 !num:执行历史命令中第num条命令 !-num:执行历史命令中倒数第num条命令 !?string?:执行最近一条包含有string字符串的命令 Ctrl+r:搜索上一条匹配的命令 !$:代表上一个命令的最后一个字符串 Esc+.:显示上一个命令的最后一个字符串 移动相关命令 Ctrl+a:将光标移到行首 Ctrl+e:将光标移到行尾 Ctrl+右箭头:向右移动一个单词 Ctrl+左箭头:向左移动一个单词 Ctrl+f:向右移动一个字符,相当于按向右按键

jQuery下拉美化搜索表单效果代码分享

本文实例讲述了jQuery下拉美化搜索表单效果.分享给大家供大家参考.具体如下: JQuery下拉美化搜索表单样式代码是一款美化下拉框的表单,样式已写好,需要的朋友改一下就可以用了. 运行效果图:-------------------查看效果------------------- 小提示:浏览器中如果不能正常运行,可以尝试切换浏览模式. 为大家分享的jQuery下拉美化搜索表单效果代码如下 <head> <meta http-equiv="Content-Type"

centos下mysql主从同步快速设置步骤分享

安装环境 centos 5.4 mysql 5.1.xx 采用rpm直接安装 xtrabackup 1.2.22 采用rpm直接安装 1. Master:/etc/my.cnf [mysqld] server-id = 1 log-bin innodb_flush_log_at_trx_commit=1 sync_binlog=1 datadir=/var/lib/mysql character-set-server=utf8 init_connect='SET NAMES utf8'设定了默认

Python和perl实现批量对目录下电子书文件重命名的代码分享

经常会遇到下载的文件或电子书,名字中间都包含了一些网址信息,实际使用中由于名字太长不方便,下面的脚本使用正则表达式来对目录下的所有文件重命名: 例如: 修改前:[我们]Mac OS X for Unix Geeks[www.jb51.net].mobi 修改后:Mac OS X for Unix Geeks.mobi python代码如下: 复制代码 代码如下: import os import re def rename_dir(dir,regex,f):   if not os.path.i

CentOS 7下安装PostgreSQL 9.6的教程分享

前言 PostgreSQL是一个强大开源的对象关系类型数据库系统,它能运行于几乎所有主要的操作系统,包括Linux.Unix(AIX.BSD.HP-UX.SGI IRIX.Mac OS.Solaris.Tru64).Windows OS.对于新的项目我是非常建议使用PostgreSQL.这里就简单的整理下CentOS下的安装过程. CentOS的源中自带有PostgreSQL,可以通过 yum list | grep postgresql 查看系统自带的版本,我这边看到的是9.2版本,个人还是比

Mac环境下php操作mysql数据库的方法分享

Mac本地环境搭建 在Mac系统,我们可以使用MAMP Pro 软件来搭建本地服务器.安装好这款软件,网站的目录在 /Applications/MAMP/htdocs 文件夹里,只需将文件放入该文件夹中,就可以通过http://localhost:8888来访问了,或者通过点击如下红色下划线按钮来快速访问站点. mac系统下安装php,两行即可. brew tap josegonzalez/homebrew-php brew install php54 安装完后配置一下,你就可以使用phpsto

Ubuntu下安装redis的2种方法分享

前言 redis是目前公认的速度最快的基于内存的键值对数据库,但redis的缺点也非常明显,仅提供最基本的hash set, list, sorted set等基于数据类型,不分表,没有schema,没有索引,没有外键,缺少int/date等基本数据类型,多条件查询需要通过集合内联(sinter,zinterstore)和连接间接实现,操作不便,开发效率低,可维护性不佳: 因此一般不将其视为完整的数据库单独使用,很多网站将redis作为高速缓存和session状态存储层,然后再与其他数据库搭配使

在Windows平台下安装与配置Memcached的方法分享

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信.但是它并不提供冗余(例如,复制其hashmap条目):当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失. Memcached由Da

win2003+IIS下安装Xcache加速的配置方法分享

在论坛后台看了半天,只有内存优化一个还没有做,但是自己以前又没有弄过,只有学了. 论坛支持Memcache.eAccelerator.Alternative PHP Cache(APC).Xcache 四种优化方式,在网上搜了很久,Memcache看的有点头晕,eAccelerator也有点莫名奇妙,最终选择Xcache. 经过一番摸索后把这个加速搞定了,手机进的时候都快了很多,效果看起来还是挺明显的,现在把配置方法写下来,以免以后重装系统或换服务器什么的又忘了怎么弄. Xcache下载地址: