1

静态作用域中,标识符可以通过分析/解析源代码来确定(与动态作用域相比,动态作用域或多或少需要知道调用者环境)。

我的问题是这个,因为静态作用域只需要解析源代码以了解作用域和标识符绑定,是在编译时进行的作用域环境/标识符绑定,还是在访问每个函数(或新作用域)时确定这些绑定.

JavaScript 示例:

var globalVar;
function fooFunc() {
  var fooVar;
  function barFunc() {
    var barVar;
  }
}

在这个简单的 JavaScript 示例中,我可以通过检查程序直观地确定 barFunc 环境将具有 barVar 变量,并且具有具有 fooVar 和 barFunc 函数的父环境,并且具有全局的父环境具有 globalVar 的范围。我很好奇编译器/解释器是否将源代码作为一个整体读取并进行绑定,或者这些确定是否是在逐个函数(或逐个作用域)的基础上做出的。

如果我不清楚,请告诉我。

谢谢你,

编辑:虽然我的示例是用 JavaScript 编写的(我对此特别好奇),但我也很好奇这在语言之间是否有所不同(即 JavaScript、C/C++、C#/VB 等)

4

2 回答 2

0

在 JavaScript 中,只有在调用函数时才会创建作用域。因此,尽管您的示例在全局范围内声明的函数中有一个函数,但只有全局范围存在。

fooFunc作用域和作用域在被调用之前barFunc不存在。由于它们从未被称为全局范围,因此它是程序中唯一的范围。哦,甚至不存在,因为从未被调用过。fooFuncbarFuncbarFuncfooFunc

当你在 JavaScript 中调用一个函数时,会为它创建一个新的执行上下文。可以将执行上下文视为函数的范围。有关更多详细信息,请参阅此答案:https ://stackoverflow.com/a/9384894/783743

顺便说一句,您也可以在 JavaScript 中模拟动态范围:是否可以在 JavaScript 中实现动态范围而不使用 eval?

于 2013-02-22T16:13:53.067 回答
0

我相信 Javascript 没有编译器,我不想引发讨论。

谈到您的问题,当 Javascript 下载到浏览器时,函数的主体永远不会执行。它需要被显式调用。因此,除非调用该函数,否则无法进行变量绑定。

于 2013-02-22T16:14:02.700 回答