作用域

✍ dations ◷ 2025-11-17 00:49:21 #计算机编程

在电脑程序设计中,作用域(scope,或译作有效范围)是名字(name)与实体(entity)的绑定(binding)保持有效的那部分计算机程序。不同的编程语言可能有不同的作用域和名字解析。而同一语言内也可能存在多种作用域,随实体的类型变化而不同。作用域类别影响变量的绑定方式,根据语言使用静态作用域还是动态作用域变量的取值可能会有不同的结果。

名字空间是一种作用域,使用作用域的封装性质去逻辑上组群起关相的众识别子于单一识别子之下。因此,作用域可以影响这些内容的名字解析。

程序员常会缩进他们的源代码中的作用域,改善可读性。

下列例子显示了C++语言中多种不同的作用域声明:

namespace N{                        // 命名空间作用域,仅是群组织别名   class C   {                     // 类作用域,定义/声明成员变量和函数      void f (bool b)      {                  // 函数作用域,包含可执行语句         if (b)         {               // 条件执行语句的无名作用域           ...         }      }   };}

静态作用域与动态作用域

静态作用域又叫做词法作用域,采用词法作用域的变量叫词法变量。词法变量有一个在编译时静态确定的作用域。词法变量的作用域可以是一个函数或一段代码,该变量在这段代码区域内可见(visibility);在这段区域以外该变量不可见(或无法访问)。词法作用域里,取变量的值时,会检查函数定义时的文本环境,捕捉函数定义时对该变量的绑定。

大多数现在程序设计语言都是采用静态作用域规则,如C/C++、C#、Python、Java、JavaScript……

相反,采用动态作用域的变量叫做动态变量。只要程序正在执行定义了动态变量的代码段,那么在这段时间内,该变量一直存在;代码段执行结束,该变量便消失。这意味着如果有个函数f,里面调用了函数g,那么在执行g的时候,f里的所有局部变量都会被g访问到。而在静态作用域的情况下,g不能访问f的变量。动态作用域里,取变量的值时,会由内向外逐层检查函数的调用链,并打印第一次遇到的那个绑定的值。显然,最外层的绑定即是全局状态下的那个值。

采用动态作用域的语言有Pascal、Emacs Lisp、Common Lisp(兼有静态作用域)、Perl(兼有静态作用域)。C/C++是静态作用域语言,但在宏中用到的名字,也是动态作用域。

相关

  • 放射性碳定年法放射性碳定年法(英语:Radiocarbon dating),又称碳测年(carbon dating)、碳十四定年法或碳十四年代测定法(carbon-14 dating),是利用自然存在的碳-14同位素的放射性定年法,用以确定原先
  • 核酸双螺旋在分子生物学中,双螺旋是指由核酸(如DNA和RNA)的双链分子所形成的结构。核酸复合物的双螺旋结构是它的二级结构的结果,并且是确定其三级结构的基本组成部分。这个术语因詹姆斯·
  • 伊朗的变性伊朗是唯一认可变性权利的伊斯兰国家。在1979年伊朗革命前,政府从未正式关注变性议题。从1980年代中期开始,伊朗伊斯兰共和国政府正式认可跨性别人士并且准许进行变性手术。19
  • 托马斯·索维尔托马斯·索维尔(英语:Thomas Sowell,1930年6月30日-),美国著名经济学家,芝加哥经济学派的代表人物之一。托马斯·索维尔1930年6月30日出生于美国北卡罗来纳州的加斯托尼亚。获得哈
  • 绝迹语言绝迹语言(英语:Extinct language),又称灭绝语言、灭亡语言、死语,指一种已经不再有人以之作为母语的语言。根据估计,每两星期就有一种人类的语言灭亡,变成绝迹语言。但在一些特殊情
  • 吉华街道吉华街道中华人民共和国广东省深圳市龙岗区下辖的一个街道办事处,名称取自街道内主要道路——吉华路,下辖水径、翠湖、光华、丽湖等共7个社区。该街道产业以高新科技产业和文
  • 月球环形山列表月球表面主要特征为环形山,大部分的环形山都是因受撞击而形成的,又称为撞击坑或陨石坑,月球环形山由国际天文联合会所命名,本列表只包含了受此官方协会所确认的陨石坑名字。下面
  • NHK岐阜放送局NHK岐阜放送局,是日本放送协会位于岐阜县岐阜市的地方放送局,也是负责主管当地事务的放送局。
  • 高铁魔盒事件高铁魔盒事件,亦可称张拾迈事件,指的是由《高铁——悄悄开启群发性地质灾害的魔盒》一篇“钓鱼文”引起的类似索卡事件的风波,该事件总体类似于索卡尔事件,在2011年7月29日文中
  • 中堂水道中堂水道位于中国广东省东莞市西北部,东起高埗镇卢村接东江南干流来水,向西至中堂镇东向村汇入倒运海水道。全长6.5千米,平均比降0.58‰。中堂水道地处东江三角洲北部,地形起伏