作用域

✍ dations ◷ 2025-04-04 18:22:48 #计算机编程

在电脑程序设计中,作用域(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++是静态作用域语言,但在宏中用到的名字,也是动态作用域。

相关

  • 特命全权公使特命全权公使,通常简称公使,是一国元首向驻在国元首派遣的次高外交代表,外交官衔上仅次于特命全权大使,但实质地位、职务以及所享受的外交特权与豁免同大使相同。特命全权公使原
  • 人中人中(拉丁语:philtrum;字源于古希腊语:φίλτρον,意为“爱的部分”)是解剖学上的一个名词,又称上巴。指上颚骨左右两部分在鼻下接合的部分。中国传统针灸在人中有人中穴,属于督
  • 仪征市仪征市(简化字后“徵”被简化为“征”,转成繁体后仍以“徵”为宜),位于中华人民共和国江苏省的中西部,南京和扬州之间,由扬州市代管。是长江中下游地区一座重要的石油化学工业城市
  • 利皮尼坐标:50°45′49″N 25°24′43″E / 50.76361°N 25.41194°E / 50.76361; 25.41194利皮尼(乌克兰语:Липини),是乌克兰的村落,位于该国西部沃伦州,由卢茨克区负责管辖,始建于
  • 伊朗工人-共产党伊朗工人-共产党(波斯语:حزب کمونیست کارگری ایران)是伊朗的一个非法的激进左翼政党。该党成立于1991年。该党的意识形态是马克思主义、工人-共产主义(由
  • 吉姆·帕蒂森詹姆斯·艾伦“吉姆”帕蒂森(1928年10月1日-)是加拿大商业大亨,投资者和慈善家。他是温哥华吉姆·帕蒂森集团的举行首席执行官、主席和唯一所有者。他被认为是加拿大第四富有的
  • 今井武夫今井武夫(日语:いまい たけお、1898年2月23日 - 1982年6月12日)日本陆军军人,军衔为陆军少将。1945年8月21日下午4时,时任日军总参谋副长今井武夫和参谋桥岛芳雄和前川国雄(翻译木
  • 科学月刊《科学月刊》()是在台湾发行的一套介绍今日各科科学的月刊。拥有四十多年历史的《科学月刊》于1970年1月1日正式出版。当时,一群留美的台湾学生,以“引介新知、启发民智”为己任
  • 大划街道大划街道,原为大划镇,是中华人民共和国四川省成都市崇州市下辖的一个乡镇级行政单位。2019年12月,撤镇设街道,大划街道办事处驻人和路68号。大划街道下辖以下地区:大划场镇社区、
  • 大安水蓑衣大安水蓑衣(学名:;拉丁语:pogon = 髯毛,calyx = 花萼),又称毛萼水蓑衣,为爵床科水蓑衣属的多年生水生挺水植物,为台湾特有种。本种在1917年由岛田弥市采得,最初描述是由早田文藏于1920