在JavaScript中,词法环境和作用域是否是同一件事?
根据我刚从《JavaScript忍者秘籍2/e》中学到的内容,给出答案:
它们是不同的概念但有关联:我们需要定义一个相关概念——执行上下文和其堆栈来理解。
执行上下文和执行上下文堆栈。 执行上下文是内部JavaScript构造,用于跟踪函数或全局代码的执行。 JS引擎维护一个栈数据结构——执行上下文堆栈或调用栈,其中包含这些上下文。 全局执行上下文位于此堆栈底部。当函数执行开始时,将创建并推送一个新的执行上下文到堆栈中。特定的执行上下文跟踪相应函数正在执行的语句指针。在对应函数的执行结束时,其执行上下文从堆栈中弹出。
词法环境是内部JS引擎构造,用于保持标识符-变量映射(这里的标识符指变量/函数名称,而变量则是实际对象(包括函数类型对象)或基本值的引用)。词法环境还保存对父级词法环境的引用。
现在,对于每个执行上下文:
每个词法环境都跟踪其父级词法环境(即父级执行上下文的词法环境)。结果,每个函数都有一系列附加到它的词法环境链。
注意:在JS中,函数是对象。使用语句创建函数意味着创建类型为Function的对象。因此,像其他对象一样,函数可以持有内部和用户定义的属性。
作用域是一个与语言无关的概念,指变量或函数对执行代码的可见性。在JS中,如果变量或函数存在于当前词法环境或封闭函数的词法环境链中,则其对执行代码可见。在全局代码的情况下,此链不存在。
希望现在您理解了...
注意:类似于函数,通过在ES6中引入的let和const,当一个块开始执行(if块、for循环块等),也会创建一个新的词法环境,其父函数的词法环境作为父级。
词法环境是函数编写所在的环境。也就是说,它的静态顺序/位置无论从哪里调用,都是固定的。
变量/函数的作用域基本上是变量可见/可访问的位置。
执行上下文是运行时任何时候执行栈的状态。这是当前执行上下文。
编辑:第三个选项是 "Execution Context"。