Deep BlueVBScriptWMIPHPC语言JavaScriptWindows API路由器Windows函数Python

VBS过程和函数参数传递的方式默认是ByVal还是ByRef?

我一直以为 VBS 过程和函数参数传递的方式默认是 ByVal,直到我膝盖中了一箭。

在《VBScript Programmers Reference》一书的101页和102页有这样一段文字:

There is one concept that was skipped during the introduction to procedure and function arguments: passing arguments by reference versus passing arguments by value . An argument is defined either by reference or by value depending on how it is declared in the procedure or function definition. A by-reference argument is indicated with the ByRef keyword, whereas a by-value argument can either be indicated with the ByVal keyword or by not specifying either ByRef or ByVal — that is, if you do not specify one or the other explicitly; ByVal is the default.

在介绍过程和函数的参数时跳过了一个概念:传址和传值。一个参数是传址还是传值取决于过程或函数定义中的声明。传址的参数用 ByRef 关键字说明,而传值的参数既可以用 ByVal 关键字说明也可以不加任何说明——也就是说,没有明确地指定是哪一种的话,ByVal 就是默认值。

只可惜这段文字是错误的,VBS 过程和函数参数传递的方式默认是 ByRef,测试如下:

Function f(x, y)
    t = x
    x = y
    y = t
End Function

'Author: Demon
'Website: http://demon.tw
'Date: 2012/2/5

x = 123 : y = 456
f x, y
WScript.Echo x, y
'输出456 123

x = 123 : y = 456
f (x), (y)
WScript.Echo x, y
'输出123 456

x = 123 : y = 456
Call f(x, y)
WScript.Echo x, y
'输出456 123

x = 123 : y = 456
Call f((x), (y))
WScript.Echo x, y
'输出123 456

x = 123 : y = 456
z = f(x, y)
WScript.Echo x, y
'输出456 123

x = 123 : y = 456
z = f((x), (y))
WScript.Echo x, y
'输出123 456

除了证明 VBS 过程和函数参数传递的方式默认是 ByRef 以外,该脚本还说明了当用括号把表达式括起来的时候,内部会创建一个临时变量来保存括号中表达式的值。


http://ken.gw.to/