簡體   English   中英

在詞法環境中如何管理塊作用域?

[英]How is block scope managed in the lexical environment?

如果我在使用var的函數中聲明變量,則該變量的插槽將添加到該函數定義的LexicalEnvironment

function() {
  var foo; 
}

在上面的代碼中,與該函數關聯的LexicalEnvironment包含一個帶有鍵foo和值為undefined的插槽。

如果我使用塊作用域聲明,那么周圍的LexicalEnvironment如何受到影響?

function() {
  {
    let foo; // How does this affect the LexicalEnvironment?
  }
}
function() {
  var foo; 
}

如您所提到的, LexicalEnvironment中的foo對於該函數內的所有內部函數都是全局的。

function() {
  {
    let foo; // How does this affect the LexicalEnviroinment?
  }
}

在這里, foo僅是該塊的本地變量。 在該塊之外將不可見。

它如何影響LexicalEnvironment

如果您要在該塊中的任何位置引用foo ,則本地let foo將覆蓋您在該函數中定義的全局var foo

關於ES6,

function example(x) {
    console.log(y); // ReferenceError: y is not defined
    if (x) {
        let y = 5;
    }
}

使用let語句聲明的變量被創建為當前執行上下文的詞法環境(而不是變量環境)上的綁定。 ES6中對塊語句規范的更改意味着每個塊都有其自己的詞匯環境。 在上面的示例中,當評估塊(if語句的主體)時,將創建一個新的詞匯環境。 當評估let語句時,綁定將添加到此詞法環境中,並且無法從外部詞法環境(函數聲明本身的詞法環境)訪問綁定。

參考

最好通過查看規范來回答此類問題:

:{ StatementList }

  1. oldEnv運行中的執行上下文的 LexicalEnvironment
  2. blockEnvNewDeclarativeEnvironmentoldEnv )。
  3. 執行BlockDeclarationInstantiationStatementListblockEnv )。
  4. 正在運行的執行上下文的 LexicalEnvironment設置blockEnv
  5. blockValue為評估StatementList的結果。
  6. 正在運行的執行上下文的 LexicalEnvironment設置oldEnv
  7. 返回blockValue

注意:不管控制如何離開LexicalEnvironment總是將其恢復到以前的狀態。

那么這里發生了什么?

當評估該塊時,將創建一個新的詞法環境,當前詞法環境為“父”。 在評估塊期間,新環境將替換當前環境。

如果我使用塊作用域聲明,那么周圍的LexicalEnvironment如何受到影響?

除了臨時替換外,它根本不受影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM