【问题标题】:In static (lexical) scope, when are the variable/declaration identifiers bound?在静态(词法)范围内,何时绑定变量/声明标识符?
【发布时间】:2013-02-22 16:03:56
【问题描述】:

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 等)之间是否存在差异.)

【问题讨论】:

    标签: javascript compiler-construction environment-variables scope


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 您知道编译语言(即 C/C++)是否在运行时或编译时进行这些绑定?
    • C/C++ 中的局部变量空间通常保留在调用堆栈上。我不知道内部原理,但我的猜测是父作用域的偏移量是在编译时确定的,但是实际地址只能在运行时实际调用函数时确定。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2020-02-03
      • 2016-09-18
      相关资源
      最近更新 更多