62

javascript中的词法环境和范围是一回事吗?

4

3 回答 3

62

根据我刚刚从“Javascript Ninja 的秘密,2/e”中学到的内容给出答案——

它们是不同的概念但相关,我们需要定义一个相关的概念 -执行上下文和它的堆栈来理解。

执行上下文执行上下文堆栈执行上下文是用于跟踪函数或全局代码执行的内部 javascript 构造。js引擎维护了一个栈数据结构——执行上下文栈或者调用栈,里面包含了这些上下文,全局的执行上下文停留在这个栈的底部。当函数开始执行时,会创建一个新的执行上下文并将其推送到堆栈中。特定的执行上下文跟踪相应函数的语句正在执行的指针。当相应函数的执行完成时,从堆栈中弹出一个执行上下文。

词法环境:内部 js 引擎构造包含标识符变量映射。(这里的标识符是指变量/函数的名称,变量是对实际对象[包括函数类型对象]或原始值的引用)。词法环境还持有对父词法环境的引用。

现在,对于每个执行上下文——1 创建一个对应的词法环境;2)如果在该执行上下文中创建了任何函数,则对该词法环境的引用存储在该函数的内部属性( [[Environment]])中. 因此,每个函数都会跟踪与其创建的执行上下文相关的词法环境。

并且每个词法环境都跟踪其父词法环境(父执行上下文的环境)。结果,每个函数都有一个附加的词法环境链。[注意:在js中函数是一个对象,通过语句创建一个函数就是创建一个Function类型的对象。所以像其他对象一样,函数可以保存内部和用户定义的属性]

范围:它是与语言无关的概念,指的是变量或函数对执行代码的可见性。在 js 中,变量或函数对执行代码是可见的,如果它在当前词法环境中或在封闭函数的词法环境链中。在全局代码的情况下,链不存在。

希望,你现在明白了..

Note: similar to function's case, by the introduction of let and const in es6, when a block begins to execute (if block, for loop block etc), a new lexical environment is also created having the parent function's lexical environment as parent.

于 2018-05-04T11:49:07.627 回答
30

以下是规范中关于词法环境的内容:

词法环境是一种规范类型,用于根据 ECMAScript 代码的词法嵌套结构定义标识符与特定变量和函数的关联。一个词法环境由一个环境记录和一个对外部词法环境的可能为空的引用组成。

基于此,我会说是的,这就是人们在说“范围”时通常所说的。

尽管可能有人认为“范围”实际上被定义为“声明性环境记录”:

每个声明性环境记录都与一个包含变量和/或函数声明的 ECMAScript 程序范围相关联。声明性环境记录绑定由包含在其范围内的声明定义的标识符集。

如果您将“范围”视为包含标识符和值之间的绑定的事物,那么第二个定义可能更适合。如果您将其视为知道其祖先作用域的东西,那么第一个定义更适合。

编辑:第三个选项是“执行上下文”。

于 2012-09-26T10:47:23.853 回答
28

词法环境是编写它的函数的环境。也就是说,它所在的静态订单/位置,无论从哪里调用它。

变量/函数的范围基本上是变量可见/可访问的位置。

执行上下文是运行时任何时候执行堆栈的状态。那是当前的执行上下文。

于 2017-01-14T01:54:09.247 回答