作用域

✍ dations ◷ 2025-11-02 23:48:37 #计算机编程

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

相关

  • 包皮过长包皮(英语:Foreskin),一般指包在雄性阴茎龟头上的一层皮,有时也包括女性生殖构造上,包覆阴蒂的阴蒂包皮。包皮在胚胎时期伴随阴茎成长,有保护龟头防止外来伤害的作用。一般在青春期
  • 电场屏蔽电场屏蔽,是一种存在于由带电粒子构成的流体中的物理现象。在由带电粒子构成的流体中,比如等离子体、半导体、或金属中的自由电子群,由于其内里各颗运动中的带电粒子带有电磁场
  • 速不台速不台(蒙古语:.mw-parser-output .font-mong{font-family:"Menk Hawang Tig","Menk Qagan Tig","Menk Garqag Tig","Menk Har_a Tig","Menk Scnin Tig","Oyun Gurban Ulus Ti
  • 幸福川幸福川(二号运河)是一条位在台湾高雄市境内的小型河川,全长约5.3公里。河道两侧为高雄市的河南路及河北路,横跨三民区、前金区、新兴区、苓雅区,上游河段延伸至苓雅区,至民族路河
  • 等熵热力学中的等熵过程(英语:Isentropic process or Isoentropic process)指的是过程中没有发生熵变,熵值保持恒定的过程。可逆绝热过程就是一种等熵过程。等熵过程在温度-熵图(T-S
  • 大历史大历史(Big History)是一个新兴学术领域,探索从 大爆炸 到现代的历史 。 它通过包括科学、人文、等,多种学科的跨学科方法来检视长远的时间框架, 并在更大的背景之下探讨人类存
  • 莫尔顿波莫尔顿波是大尺度的太阳日冕激波在色球上的记号,有如在太阳上发生的一种海啸,它们是由太阳闪焰生成的。它们的名称来自美国天文学家盖亚·莫尔顿,他在加利福尼亚州伯班克的洛克
  • 振吉电化厂振吉电化厂是一家台湾卫浴设施生产批发商,以电光牌(TENCO)为行销品牌。1949年,振吉电化厂成立于高雄市。1953年5月,振吉电化厂改组成立“振吉电化厂股份有限公司”;同年,位在高雄的
  • 1964年亚足联青年锦标赛1964年亚洲足球联合会青年锦标赛在越南共和国的西贡市举行。以下球队参加了锦标赛:比赛结果:比赛结果:马来西亚 v 韩国缅甸 v 以色列
  • 米哈伊尔·博格达诺维奇·巴克莱·德托利米哈伊尔·博格达诺维奇·巴克莱·德托利亲王(Mikhail Bogdanovich Barklay-de-Tolli,西里尔字母: Михаи́л Богда́нович Баркла́й-де-То́лл