糟糕的JavaScript词汇范围示例

Poorly Worded JavaScript Lexical Scope Example

本文关键字:范围 词汇 JavaScript      更新时间:2023-09-26

我正在读一篇文章,试图理解词法范围以及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]]?两者似乎都不起作用。


更新

有问题的文章在这里

首先要理解单词词法在上下文中的含义。"词法"作用域是指通过在源代码中函数定义的上下文中查看函数、函数内的声明(varletconstfunction)以及向外到全局作用域的封闭函数层中的声明,可以清楚地看到的作用域。这是一个只查找大括号和周围的function声明或表达式的过程。

因此,这种描述只是一种正式的说法,即符号引用是通过查找在本地范围中定义的符号来解决的,然后在周围的一系列"更全局"范围中,一直到实际的全局范围。(注意,在Node中,情况有点不同,因为实际的全局作用域并不是词法作用域链的直接部分。)

我看到"词法范围界定"也被称为"静态范围界定",我认为这是有意义的,因为它意味着范围规则是在为每个函数(以及在ES2015中,为let创建每个块)创建时最终确定的。特别是,范围界定不是动态的—规则中没有涉及函数在何处或何时被调用

这个问题在很大程度上与闭包有关,或者更确切地说,实际上是一个关于闭包的问题,正如你链接的文章中所写的那样,有一篇关于这个问题的文章写得很好,这帮我理解了很多,它是:

关于javascript闭包