在静态(词法)范围内,变量/声明标识符何时绑定?

时间:2013-02-22 16:03:56

标签: javascript compiler-construction environment-variables scope

static scoping,中,可以通过分析/解析源代码来确定标识符(与需要或多或少知道调用者环境的动态范围确定)。

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

JavaScript示例:

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

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

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

谢谢,

编辑:虽然我的示例是在JavaScript中(我特别好奇),但我也很好奇语言之间是否存在差异(即JavaScript,C / C ++,C#/ VB等) 。)

2 个答案:

答案 0 :(得分:0)

在JavaScript中,仅在调用函数时创建范围。因此,尽管您的示例在全局范围内声明的函数内部具有函数,但仅存在全局范围。

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

在JavaScript中调用函数时,会为其创建新的执行上下文。执行上下文可以被认为是函数的范围。有关详细信息,请参阅此答案:https://stackoverflow.com/a/9384894/783743

顺便说一下,您也可以在JavaScript中模拟动态范围:Is it possible to achieve dynamic scoping in JavaScript without resorting to eval?

答案 1 :(得分:0)

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

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