编程基础:全局变量和局部变量
外观
	
	
 全局变量 - 在程序开始时声明,其全局作用域意味着它可以在程序中的任何过程或子程序中使用
很少建议使用全局变量,因为它们容易导致错误,浪费内存,并且在跟踪代码时难以理解。如果您声明一个全局变量,它将在程序运行时继续使用内存,即使您不再需要/使用它。
 局部变量 - 在子程序或编程块中声明,其局部作用域意味着它们只能在声明它们的子程序或程序块中使用
局部变量在有限的范围内初始化,这意味着它们在调用函数或子程序时声明,并且函数结束后,变量占用的内存将被释放。这与全局变量形成对比,全局变量不会释放内存。
看看这个例子
Module Glocals
	Dim number1 as integer = 123
	
	Sub Main()
		console.writeline(number1)
		printLocalNumber()
		printGlobalNumber()
	End Sub
	
	Sub printLocalNumber
		Dim number1 as integer = 234
		console.writeline(number1)
	End Sub
	Sub printGlobalNumber
		console.writeline(number1)
	End Sub
End Module
输出会是什么?
为什么是这样? 好像我们有两个版本的变量 number1。
- 第一个版本在第 2 行声明,它不在任何子例程中声明,因此该变量具有全局作用域
- 第二个版本在 printLocalNumber 子例程中声明。由于它是在子例程中声明的,因此它只能在该子例程中使用。在第 12 行,当我们使用:console.writeline(number1)时,它会打印出局部变量
因此,查看 main 子例程中的代码,我们有 3 种不同的方法可以打印出变量 number1。
- 第 5 行。console.writeline(number1):这使用 number1 的全局值,因为它在一个没有其他局部声明的子例程中
- 第 6 行。printLocalNumber():这调用了子例程printLocalNumber(),其中包含一个局部变量 number1,该变量在第 11 行中声明,因此它使用在第 11 行声明的 number1 值。
- 第 7 行。printGlobalNumber():这调用了子例程printGlobalNumber(),该子例程没有 number1 的局部变量,因此它使用 number1 的全局值

经验法则:如果您想快速区分全局变量和局部变量,请使用这些快速规则。但要注意,他们可能会试图欺骗你!
- 如果一个变量在函数或过程中声明,它就是一个局部变量
- 如果一个变量在迭代或选择语句中声明,它就是一个局部变量
- 如果声明从左侧边界缩进,它可能满足上述其中一个条件,并且是局部的
- 如果它不满足上述任何条件,并且在代码的主体中声明,它就是一个全局变量
| 标题 全局变量和局部变量有什么区别? 答案 全局变量可以从程序的所有部分访问,而局部变量只能在编程结构(如循环、函数或过程)内访问 为什么使用局部变量而不是全局变量是个好主意? 答案 局部变量在您完成使用后会释放内存,全局变量始终存储在内存中,无论您是否需要它们 在什么情况下您可能想要使用全局变量? 答案 当您想要声明一个需要被代码所有部分访问的变量时 
 列出以下代码的全局变量和局部变量。输入 Module calcAge
	Sub Main()
		dim age as integer
		console.writeline("age?")
		age = console.readline()
		printMonths(age)
		printDays(age)
	End Sub
	Dim months as integer
	Sub printDays(a)
		Dim d as integer
		d = a * 365
		console.writeline(d)
	End Sub
	Sub printMonths(a)
		months = a * 12
		console.writeline(months)
	End Sub
End Module
对于上面的代码,如何使代码更高效,以及为什么它会更高效? 答案 将 months变量放在printMonths(a)子例程中,使其成为局部变量。如果您将其保留为全局变量,即使您不需要它,它也会占用内存。列出以下代码中的全局变量和局部变量,列出输出 Module greetings
	Dim q as integer = 6
	Sub sayGoodbye()
		for y = 1 to q
			console.write("bye,")
		loop
	End Sub
	Sub sayHello()
		dim q as integer = 4
		if q =< 4 then
			console.write("hi,")
		else
			console.write("hello,")
		endif
	End Sub
	Sub Main()
		console.writeline(q)
		sayHello()
		sayGoodbye()
		console.writeline(q)
	End Sub
End Module
 | 
