adn*_*2nd 25
根据我刚刚从'Javascript Ninja,2/e的秘密'中学到的东西给出答案 -
它们是不同的概念但相关,我们需要定义一个相关的概念 - 执行上下文和它的堆栈来理解.
执行上下文和执行上下文堆栈:执行上下文是用于跟踪函数或全局代码的执行的内部javascript构造.js引擎维护堆栈数据结构 - 执行上下文堆栈或调用堆栈,其中包含这些上下文,并且全局执行上下文保留在此堆栈的底部.并且在执行函数开始时创建新的执行上下文并将其推送到堆栈.特定的执行上下文跟踪指针,其中正在执行相应函数的语句.当相应的函数执行完成时,从堆栈中弹出执行上下文.
词汇环境:它是内部js引擎构造,包含标识符变量映射.(此处标识符是指变量/函数的名称,变量是对实际对象[包括函数类型对象]或原始值的引用).词汇环境也包含对父词汇环境的引用.
现在,对于每个执行上下文 - 1)创建相应的词法环境,2)如果在该执行上下文中创建了任何函数,则对该词汇环境的引用存储在该函数的内部属性([[Environment]])中.因此,每个函数都跟踪与其创建的执行上下文相关的词法环境.
每个词汇环境都跟踪其父级词汇环境(父执行上下文环境).因此,每个函数都附加了一系列词汇环境.[注意:在js中,函数是一个对象,通过语句创建函数意味着创建一个Function类型的对象.所以像其他对象一样,函数可以保存内部和用户定义的属性]
范围:它是与语言无关的概念,用于指代变量或函数对执行代码的可见性.在js中,变量或函数对于执行代码是可见的,如果它存在于当前词法环境中或封闭函数的词汇环境链中.在全局代码的情况下,链不存在.
希望,您现在明白了..如果任何句子难以理解,请添加评论.
注意:类似于函数的情况,通过在es6中引入let和const,当一个块开始执行时(如果是块,对于循环块等),还会创建一个新的词法环境,将父函数的词法环境作为父项.
Jam*_*ice 23
以下是关于词汇环境的规范:
词汇环境是一种规范类型,用于根据ECMAScript代码的词法嵌套结构定义标识符与特定变量和函数的关联.词汇环境由环境记录和外部词汇环境的可能空引用组成.
基于此,我会说是的,这就是人们在说"范围"时通常会谈论的内容.
尽管可能有人认为"范围"实际上被定义为" 声明性环境记录 ":
每个声明性环境记录与包含变量和/或函数声明的ECMAScript程序范围相关联.声明性环境记录绑定由其范围内包含的声明定义的标识符集.
如果您将"范围"视为包含标识符和值之间绑定的事物,那么第二个定义可能更适合.如果您认为它是了解其祖先范围的东西,那么第一个定义更适合.
编辑:第三个选项是" 执行上下文 ".
小智 14
词汇环境是编写函数的环境.也就是说,它所处的静态顺序/位置,无论它从何处被调用.
变量/函数的范围基本上是变量可见/可访问的位置.
执行上下文是运行时期间任何时刻执行堆栈的状态.那是当前的执行上下文.