词法作用域与动态作用域的区别
2015-01-22 13:45
281 查看
在计算机程序设计中,变量是名字(name)与实体(entity)的绑定(binding)。一段程序代码中所用到的名字并不总是有效(或者说:可用的),而限定这个变量名字具有可用性的代码范围就是这个名字的作用域。不同的程序设计语言可能有不同的作用域和名字解析设计。同一语言内也可能存在多种作用域,随实体的类型变化而不同。作用域类别影响变量的绑定方式,根据语言使用静态作用域(词法作用域)还是动态作用域变量的取值可能会有不同的结果。
静态作用域又叫做词法作用域,采用词法作用域的变量叫词法变量。词法变量有一个在编译时静态确定的作用域。词法变量的作用域可以是一个函数或一段代码,该变量在这段代码区域内可见(visibility);在这段区域以外该变量不可见(或无法访问)。词法作用域里,取变量的值时,会检查函数定义时的文本环境,捕捉函数定义时对该变量的绑定。大多数现在程序设计语言都是采用静态作用域规则,如C/C++、C#、Python、Java、JavaScript……
采用动态作用域的变量叫做动态变量。只要程序正在执行定义了动态变量的代码段,那么在这段时间内,该变量一直存在;代码段执行结束,该变量便消失。这意味着如果有个函数f,里面调用了函数g,那么在执行g的时候,f里的所有局部变量都会被g访问到。在静态作用域的情况下,g不能访问f的变量。动态作用域里,取变量的值时,会由内向外逐层检查函数的调用链,并打印第一次遇到的那个绑定的值。显然,最外层的绑定即是全局状态下的那个值。采用动态作用域的语言有Emacs
Lisp、Common Lisp(兼有静态作用域)、Perl(兼有静态作用域)。C/C++的宏中用到的名字,也是动态作用域。
具体参见Scope
(computer science)
静态作用域又叫做词法作用域,采用词法作用域的变量叫词法变量。词法变量有一个在编译时静态确定的作用域。词法变量的作用域可以是一个函数或一段代码,该变量在这段代码区域内可见(visibility);在这段区域以外该变量不可见(或无法访问)。词法作用域里,取变量的值时,会检查函数定义时的文本环境,捕捉函数定义时对该变量的绑定。大多数现在程序设计语言都是采用静态作用域规则,如C/C++、C#、Python、Java、JavaScript……
采用动态作用域的变量叫做动态变量。只要程序正在执行定义了动态变量的代码段,那么在这段时间内,该变量一直存在;代码段执行结束,该变量便消失。这意味着如果有个函数f,里面调用了函数g,那么在执行g的时候,f里的所有局部变量都会被g访问到。在静态作用域的情况下,g不能访问f的变量。动态作用域里,取变量的值时,会由内向外逐层检查函数的调用链,并打印第一次遇到的那个绑定的值。显然,最外层的绑定即是全局状态下的那个值。采用动态作用域的语言有Emacs
Lisp、Common Lisp(兼有静态作用域)、Perl(兼有静态作用域)。C/C++的宏中用到的名字,也是动态作用域。
具体参见Scope
(computer science)
相关文章推荐
- 深入理解javascript作用域系列第二篇——词法作用域和动态作用域
- javascript基础(函数与方法的区别,变量作用域,变量和函数的声明提前,函数作用域)(十五)
- 一个例子说明C语言中代码块作用域、函数作用域、函数原型作用域、文件作用域的区别
- 词法作用域和动态作用域
- 一文搞懂:词法作用域、动态作用域、回调函数、闭包
- 理清JS中的词法、静态、动态、函数、块作用域
- 作用域-词法作用域和动态作用域
- 词法作用域和动态作用域
- 深入作用域之静态作用域与动态作用域
- 【Java反射学习笔记系列之jdk动态代理】静态代理和动态代理的区别以及动态代理的作用和实现
- java作用域public ,private ,protected 及不写时的区别
- 动态网站和静态网站的区别?
- 外连接 ON 条件的三个作用 SQL中on条件与where条件的区别
- 技术总监和CTO的区别 浅谈CTO的作用----软件公司如何开源节流(一)
- 路由器和交换机分别起什么作用,它们之间有什么区别?
- java作用域public ,private ,protected 及不写时的区别
- 【转】技术总监和CTO的区别 浅谈CTO的作用----软件公司如何开源节流(一)
- 匿名namespace的作用以及它与static的区别
- 技术总监和CTO的区别 浅谈CTO的作用----软件公司如何开源节流(一) 推荐
- 面试题-Java作用域描述符的区别