作用域

✍ dations ◷ 2025-08-17 13:05:27 #计算机编程

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

相关

  • ICD-9-CM V3人体解剖学 - 人体生理学 组织学 - 胚胎学 人体寄生虫学 - 免疫学 病理学 - 病理生理学 细胞学 - 营养学 流行病学 - 药理学 - 毒理学国际疾病与相关健康问题统计分类(英语:I
  • 牙科人体解剖学 - 人体生理学 组织学 - 胚胎学 人体寄生虫学 - 免疫学 病理学 - 病理生理学 细胞学 - 营养学 流行病学 - 药理学 - 毒理学牙医学(法语:Dentisterie; 英语:Dentistr
  • 智慧智慧是高等生物所具有的基于神经器官(物质基础)一种高级的综合能力,包含有:感知、知识、记忆、理解、联想、情感、逻辑、辨别、计算、分析、判断、文化、中庸、包容、决定等多种
  • 生质柴油生物柴油(Biodiesel),是用未加工过的或者使用过的植物油以及动物脂肪通过不同的化学反应制备出来的一种被认为是环保的生质燃料。这种生物燃料可以像柴油一样使用。生产生物柴
  • 光场相机光场相机是一种捕捉景物所形成光场资讯的相机,除了记录不同位置下光的强度及颜色外,也记录不同位置下光线的方向,而一般的相机只能记录不同位置下光的强度。有一种光场相机是在
  • 日本盂兰盆节盂兰盆节(日语:お盆/おぼん )是日本的传统节日,即当地的中元节与盂兰盆节,或简称御盆节。日本在飞鸟时代由隋唐时期的中国传入盂兰盆节,后来与当地民俗结合,具有独特的庆祝方式。明
  • 阿卜杜勒·拉希姆阿卜杜勒·拉希姆(阿拉伯语:عبد الرحيم‎;罗马化为“Abdul Rahim”或“Abdur Rahim”)是一个男性穆斯林名称,由阿拉伯语单词()和 组成。这个名称带有“仁慈的仆人”之意,而
  • 每日耐受量每日耐受量(英语:Tolerable Daily Intake,简称TDI),是指在生物体的体内,每天所能容忍摄入的最大毒物质量,如果超出每日的耐受量,则会对身体造成伤害。中国大陆早在2008年6月就有传出
  • 库尔特·亨泽尔库尔特·威廉·塞巴斯蒂安·亨泽尔(Kurt Wilhelm Sebastian Hensel,1861年12月29日-1941年6月1日),德国数学家。亨泽尔在波恩及柏林学习数学,1884年在克罗内克指导下取得博士学位,1
  • 佛蒙特州一百五十周年半美元佛蒙特州一百五十周年半美元(Vermont Sesquicentennial half dollar)又名本宁顿-佛蒙特半美元(Bennington–Vermont half dollar)或本宁顿之役一百五十周年半美元(Battle of Benni