关于ls函数调用的两个问题

先看看下面的一点代码:

问题是三次msgbox打出来的都应该是什么?我们先来分析以下这段代码,答案在最后揭晓。

这段代码涉及到ls里面的两个问题:函数/过程调用的方法和其参数传递的方法。
先说说函数/过程的调用方法。ls里面调用函数/过程有四种方式:

Syntax 1
Call subOrFunction [ ( [ argList ] ) ]
Syntax 2
subOrFunction [ argList ]
Syntax 3
subOrFunction ( argPassedByVal )
Syntax 4 (functions only)
returnVal = function [ ( [ argList ] ) ]

前两种一样,就是一般的调用,不获得返回的值;第三种是以按值的方式传递参数(参数只能是一个);第四种是函数专有的,调用函数,并将返回的值赋给另外的变量。

再来看参数传递的方法。ls里面传递参数有两种方式:按值和按引用。按值传递就是说在函数体里面改变参数的值,当函数运行完毕回到调用它的部分时,传入参数的值不会变化;按引用则会发生变化。数组、列表、对象这些类型必须按引用传递,其他类型默认按引用传递,函数声明中写明byval,或者调用时用小括号将参数括起来才按值传递。

我们再回到开始的代码中来。myFn函数有一个整形的参数,所以默认按引用传递,也就是说执行完myFn后,传入的参数会被加一。来看第一次调用:call myFn(i),是属于上面说的第一种调用方法,所以调用后i的值被加一;第二次调用:myFn(i),属于第三种调用方法,按值传递,所以调用后i值不变;第三次调用:myFn(i),属于第二种调用方法,调用后i值加一。所以三次打印的结果分别是:2、2、3,你答对了么?

最后总结一下,我们调用函数的时候应该使用方法一和方法四,尽量不要使用方法二、方法三,因为他们两个比较容易混淆。并且通过方法一、方法四也可以按值调用:Call subOrFunction (( argPassedByVal ))和returnVal = function(( argPassedByVal ))。