跳转到内容

编程基础/作用域

来自维基教科书,开放的书籍,为开放的世界

标识符名称绑定(将名称与实体相关联,例如变量)的作用域是计算机程序中绑定有效的区域:可以使用名称来引用实体的区域。这样的区域被称为作用域块。在程序的其他部分,名称可能引用不同的实体(可能具有不同的绑定),或者根本不引用任何东西(可能未绑定)。[1]

作用域是程序中识别具有标识符名称的项目(无论是变量、常量、函数等)的区域。在我们的讨论中,我们将使用一个变量,变量在程序中的定义位置决定了它的作用域。

全局作用域(以及由此扩展的全局数据存储)发生在变量在“函数外部”定义时。在编译程序时,它将在程序数据区域内为变量创建存储区域,作为目标代码的一部分。目标代码包含机器代码部分、数据区域和链接器解析指令。由于变量具有全局作用域,因此它可用于源代码中的所有函数。它甚至可以被链接到代码的其他目标模块中的函数使用;但是,我们现在先忽略这个解释。此时应该学会一个关键的措辞变化。虽然变量具有全局作用域,但技术上它只在定义点到程序源代码结束之间可用。这就是为什么大多数具有全局作用域的变量都放置在源代码的顶部,在任何函数之前。这样它们对所有函数都是可用的。

局部作用域(以及由此扩展的局部数据存储)发生在变量在“函数内部”定义时。在编译时,编译器会创建机器指令,这些指令将指导在称为堆栈的区域上创建存储位置,堆栈是计算机内存的一部分。这些内存位置存在直到函数完成其任务并返回到其调用函数。在汇编语言中,我们谈论的是在函数终止时将项目压入堆栈和弹出堆栈。因此,堆栈是所有函数使用的可重用内存区域,并在函数终止时释放。虽然变量具有局部作用域,但技术上它只在定义点到函数结束之间可用。将数据项传递到函数的参数传递将它们建立为局部变量。此外,函数所需的任何其他变量或常量通常出现在函数定义的顶部,以便在整个函数代码执行期间可用。

作用域是模块化的重要概念。程序控制函数可以使用全局作用域来定义变量和常量,将它们放在程序的顶部,在任何函数之前。特定任务函数只使用局部作用域变量,通过参数传递将必要的数据传递到函数中,并在需要时创建局部变量和常量。任何需要传回调用函数的信息再次通过参数传递完成。这种将所有数据传入和传出函数的封闭通信模型为封装创建了一个重要的前身概念,封装用于面向对象编程。

关键术语

[编辑 | 编辑源代码]
数据区域
目标代码文件的一部分,用于存储数据。
全局作用域
在函数外部定义的数据存储。
局部作用域
在函数内部定义的数据存储。
作用域
源代码文件中识别标识符名称的区域。
堆栈
计算机内存的一部分,用于存储数据。

参考文献

[编辑 | 编辑源代码]
华夏公益教科书