可调用的一段代码(例程)可以是一个Sub(因其作用而被调用),也可以是一个Function(因其返回值而被调用),或者两者混合。正如MsgBox文档所示,
显示对话框中的消息,等待用户单击按钮,并返回指示用户单击了哪个按钮的值。
MsgBox(prompt[, buttons][, title][, helpfile, context])
表明该例程属于第三种。
VBScript的语法规则很简单:
在调用函数时使用参数列表()
如果您想向用户显示消息并需要知道用户的响应:
Dim MyVar
MyVar = MsgBox ("Hello, World!", 65, "MsgBox Example")
' MyVar contains either 1 or 2, depending on which button is clicked.
调用(子过程)Sub时,不要使用参数列表()
如果你只是想向用户显示一条消息而不关心其响应:
MsgBox "Hello, World!", 65, "MsgBox Example"
这种美丽的简洁性被以下问题搅乱:
使用 () 来表示参数列表和强制按值调用语义的设计缺陷
>> Sub S(n) : n = n + 1 : End Sub
>> n = 1
>> S n
>> WScript.Echo n
>> S (n)
>> WScript.Echo n
>>
2
2
S(n)并不意味着“用n调用S”,而是“用n的值的副本调用S”。
程序员看到这个可能会误解
>> s = "value"
>> MsgBox(s)
'
工作人员'在尝试时会有惊喜:
'
>> MsgBox(s, 65, "MsgBox Example")
>>
Error Number: 1044
Error Description: Cannot use parentheses when calling a Sub
编译器在处理Sub调用中的空()时比较宽松。被用于设置随机数种子的副作用而被调用的“纯净”Sub Randomize
可以被调用。
Randomize()
虽然()不能既表示“给我你的返回值”也不能表示“传递某个值”,但在这里更加严格的规定会迫使程序员注意其差异。
Randomize n
和
Randomize (n)
使用 Call 语句可以在 Sub 调用中传递参数列表 ():
>> s = "value"
>> Call MsgBox(s, 65, "MsgBox Example")
这进一步鼓励程序员在毫无思考的情况下使用括号。
(基于What do you mean "cannot use parentheses?")