2015-04-02 18 views
8

如果我使用var在函数中声明了一个变量,则该变量的一个插槽将添加到该函数定义的LexicalEnvironment中。如何块范围在词法环境管理?

function() { 
    var foo; 
} 

在上面的代码与所述功能相关联的LexicalEnvironment包含具有键foo槽和undefined的值。

如果我使用一个块范围的声明,如何在围绕LexicalEnvironment影响?

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

回答

3
function() { 
    var foo; 
} 

至于你提到的foo可在LexicalEnvironment是全球性的,以该函数内的所有内部功能。

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语句被评估时,绑定被添加到这个词汇环境中,并且从外部词汇环境(函数声明本身的环境)是不可访问的。

Refer

+0

那么,在ES6中,块可以引入新的'LexicalEnvironment's?还是有变化,以便“LexicalEnvironment”可以有多个[[Scope]]? – Ben 2015-04-02 10:14:16

+0

根据上下文,'LexicalEnvironment'将有多个'[[scope]]'。 – mohamedrias 2015-04-02 10:16:07

+0

...这是从ES5的变化? – Ben 2015-04-02 10:16:55

1

类似这样的问题,最好通过查看spec回答:

:{语句列表}

  1. oldEnv b e running execution context’sLexicalEnvironment
  2. blockEnvNewDeclarativeEnvironmentoldEnv)。
  3. 执行BlockDeclarationInstantiationStatementList,blockEnv)。
  4. running execution context’sLexicalEnvironment设置为blockEnv
  5. blockValue是评估结果StatementList
  6. running execution context’sLexicalEnvironment设置为oldEnv
  7. 返回blockValue

注意:无论如何控制离开块词汇环境总是恢复到其以前的状态。

那么这里会发生什么?

评估该块时,会创建一个新的词汇环境,并将当前词汇环境设置为“父级”环境。新环境会在评估块的过程中替换当前环境。

如果我使用块范围声明,周围的LexicalEnvironment如何受到影响?

除了临时更换外,根本不受影响。