糟糕的JavaScript词汇范围示例
Poorly Worded JavaScript Lexical Scope Example
我正在读一篇文章,试图理解词法范围以及VariableEnvironment是如何工作的。我理解代码,它很有道理,但我没有得到前面的解释,这让我有点担心。有人能帮我把它重新写一遍,以确保我完全理解这一点吗?
每个函数都有一个[[scope]]属性,当调用该函数时,scope属性的值被分配给其VariableEnvironment的外部词法环境引用(或outerLex)属性。(ES 5 10.4.3.5-7)通过这种方式,每个VariableEnvironment都继承自其词法父级的VariableEnvironment。这个作用域链接从全局对象开始运行词法层次结构的长度。
//VariableEnvironment: {x: undefined, etc.};
var x = "global";
//VariableEnvironment: {x: "global", etc.};
function outer() {
//VariableEnvironment: {y: undefined, outerLex: {x: "global", etc.}};
var y = "outer";
//VariableEnvironment: {y: "outer", outerLex: {x: "global", etc.}};
function inner() {
//VariableEnvironment: {x: undefined, outerLex: {y: "outer", outerLex: {x:"global", etc.}};
var x = "inner";
//VariableEnvironment: {x: "inner", outerLex: {y: "outer", outerLex: {x:"global", etc.}};
}
}
是否还有访问函数的VariableEnvironment的方法函数.VariableEnvironment?或者函数。[[scope]]?两者似乎都不起作用。
更新
有问题的文章在这里
首先要理解单词词法在上下文中的含义。"词法"作用域是指通过在源代码中函数定义的上下文中查看函数、函数内的声明(var
、let
、const
、function
)以及向外到全局作用域的封闭函数层中的声明,可以清楚地看到的作用域。这是一个只查找大括号和周围的function
声明或表达式的过程。
因此,这种描述只是一种正式的说法,即符号引用是通过查找在本地范围中定义的符号来解决的,然后在周围的一系列"更全局"范围中,一直到实际的全局范围。(注意,在Node中,情况有点不同,因为实际的全局作用域并不是词法作用域链的直接部分。)
我看到"词法范围界定"也被称为"静态范围界定",我认为这是有意义的,因为它意味着范围规则是在为每个函数(以及在ES2015中,为let
创建每个块)创建时最终确定的。特别是,范围界定不是动态的—规则中没有涉及函数在何处或何时被调用。
这个问题在很大程度上与闭包有关,或者更确切地说,实际上是一个关于闭包的问题,正如你链接的文章中所写的那样,有一篇关于这个问题的文章写得很好,这帮我理解了很多,它是:
关于javascript闭包
- 正在全局范围中查找JavaScript函数
- 如何通过数组更新角度子范围
- 如何使用ngrepeat和双向绑定获得指令的隔离范围
- HTML范围:动态设置值属性
- "实例范围”;TypeScript类的getter/setter
- jquery日期选择器年份范围默认值
- Jpgraph:如何手动设置X轴和Y轴的范围
- 在对象数组中查找多个值的d3范围
- 动态加载angularjs并生成控制器和范围
- 如何通过谷歌应用程序脚本从谷歌文档中的位置确定命名范围
- 在Materialize Calendar中设置年份范围
- 在MVVM视图模型中处理应用程序范围的元素
- setInterval游戏循环的范围问题
- AngularJS获取范围中的选定项目
- 从指定范围创建字符数组
- 糟糕的JavaScript词汇范围示例
- 角承诺的“then”函数的成功回调的词汇范围是什么?
- 帮助我理解这种结构(词汇范围)
- Javascript 词汇范围
- 试图在示例中理解词汇范围