生存期(lifetime):就是在脚本运行时,变量在内存中存在且能使用的时间。
变量只有在它的作用域内才有效。一个过程级作用域的变量只有在运行该过程时才有效。当过程结束时,保存该变量的内存就会被释放,就像不存在这个变量一样。同样,脚本级作用域的变量只有在脚本运行时才有效。类似的,类级作用域的变量只有在其它代码使用了基于这个类的对象时才有效。
通过限制变量的作用域,就能限制变量的生存期。这里有一个要时刻记住的重要原则:必须要尽可能地限制变量的生存期和作用域。因为变量会消耗内存,以及操作系统和脚本引擎的资源,只要变量有效就需要这些资源。在使用变量的过程内部声明变量,就能在该过程没有运行时节约该变量所需的资源。
但实际上,资源消耗并不是限制变量作用域的最重要原因;限制作用域可以减少程序的错误,并提高代码的可理解性和可维护性。如果脚本中有多个过程和函数,而所有的变量都是声明为脚本级的,那这些过程和函数就都能修改这些变量。这种情况下任何代码都能随时修改变量,程序员要维护这种代码就很困难。
看一下这个说明变量作用域和生存期的例子:
Option ExplicitPrivate DateTodayDateToday = DateMsgBox "明天是:" & AddOneDay(DateToday) Function AddOneDay(DateAny) Dim DateResult DateResult = DateAdd("d", 1, DateAny) AddOneDay = DateResultEnd Function
这个脚本有一个AddOneDay()函数。用Dim在函数内部声明的变量 DateResult 的作用域是过程级的,这就说对于函数外部的代码该变量无效。而变量 DateToday 使用Private声明的,有脚本级的作用域。变量 DateResult 只有在AddOneDay()函数运行时才被激活,而 DateToday 在整个脚本的生存期内都是激活的。