词汇环境和功能范围

时间:2012-09-26 10:45:13

标签: javascript function

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

3 个答案:

答案 0 :(得分:22)

以下是关于lexical environments的规范:

  

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

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

虽然可能有人认为“范围”实际上被定义为“Declarative Environment Record”:

  

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

如果您认为“范围”是包含标识符和值之间绑定的东西,那么第二个定义可能更适合。如果你认为它是一个意识到它的祖先范围的东西,那么第一个定义就更合适了。

编辑:第三个​​选项是“Execution Context”。

答案 1 :(得分:20)

根据我刚刚从'Javascript Ninja,2 / e的秘密'中学到的东西给出答案 -

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

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

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

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

每个词汇环境都会跟踪其父级词汇环境(父执行上下文环境)。因此,每个函数都附加了一系列词汇环境。 [注意:在js中,函数是一个对象,通过语句创建函数意味着创建一个Function类型的对象。与其他对象一样,函数可以包含内部和用户定义的属性]

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

希望,您现在明白了..如果任何句子难以理解,请添加评论。

注意:类似于函数的情况,通过在es6中引入 let和const ,当块开始执行时(如果块, for loop < / strong>阻止等),还创建了一个新的词法环境,将父函数的词汇环境作为父级。

答案 2 :(得分:11)

Lexical Environment是编写函数的环境。也就是说,它所处的静态顺序/位置,无论它从何处被调用。

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

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