在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等) 。)
答案 0 :(得分:0)
在JavaScript中,仅在调用函数时创建范围。因此,尽管您的示例在全局范围内声明的函数内部具有函数,但仅存在全局范围。
在调用fooFunc
和barFunc
之前,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被下载到浏览器时,函数的主体永远不会被执行。需要明确调用它。因此,除非调用该函数,否则无法进行变量绑定。