[英]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 }
- 讓oldEnv為運行中的執行上下文的 LexicalEnvironment 。
- 令blockEnv為NewDeclarativeEnvironment ( oldEnv )。
- 執行BlockDeclarationInstantiation ( StatementList , blockEnv )。
- 將正在運行的執行上下文的 LexicalEnvironment設置為blockEnv 。
- 令blockValue為評估StatementList的結果。
- 將正在運行的執行上下文的 LexicalEnvironment設置為oldEnv 。
- 返回blockValue 。
注意:不管控制如何離開LexicalEnvironment總是將其恢復到以前的狀態。
那么這里發生了什么?
當評估該塊時,將創建一個新的詞法環境,當前詞法環境為“父”。 在評估塊期間,新環境將替換當前環境。
如果我使用塊作用域聲明,那么周圍的
LexicalEnvironment
如何受到影響?
除了臨時替換外,它根本不受影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.