首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >词法环境和函数作用域

词法环境和函数作用域
EN

Stack Overflow用户
提问于 2012-09-26 18:45:13
回答 3查看 33.7K关注 0票数 57

javascript中的词法环境和作用域是一回事吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-04 19:49:08

根据我刚刚从“Javascript忍者的秘密,2/e”中学到的东西,给出了答案--

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

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

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

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

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

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

希望,你现在明白了..。

注意:与函数的情况类似,通过在es6中引入let和const,当一个块开始执行时(if块,for loop块等),还会创建一个新的词法环境,将父函数的词法环境作为父函数。

票数 57
EN

Stack Overflow用户

发布于 2012-09-26 18:47:24

以下是该规范对lexical environments的描述

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

基于这一点,我会说是的,这就是人们在说“作用域”时通常谈论的。

尽管可能会争论“作用域”实际上被定义为"Declarative Environment Record":

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

如果你认为“作用域”是一个包含标识符和值之间绑定的东西,那么第二个定义可能更合适。如果你认为它是知道它的祖先作用域的东西,那么第一个定义更合适。

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

票数 30
EN

Stack Overflow用户

发布于 2017-01-14 09:54:09

词法环境是编写函数的环境。也就是说,它所处的静态顺序/位置,而不管它是从哪里调用的。

变量/函数的作用域基本上是变量可见/可访问的位置。

执行上下文是指运行时期间任意时刻的执行堆栈的状态。这就是当前的执行上下文。

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12599965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档