JavaScript - “实现定义的对象”

时间:2013-01-15 14:41:40

标签: javascript

我正在阅读“JavaScript:The Definitive Guide,第6版”,以及“3.10.3范围链”(第55页)一节中所述 -

  

“如果我们将局部变量视为某种属性   实现定义的对象,然后还有另一种思考变量范围的方法。“

有人可以解释“实现定义的对象”的含义吗?

2 个答案:

答案 0 :(得分:3)

局部变量在内部表示为对词法环境的绑定,如规范(ES5 10.5所示 - 请注意以下引用中的“env”是指当前范围的词法环境):

  
      
  • 对于代码中的每个 VariableDeclaration VariableDeclarationNoIn d ,在源文本顺序中执行

         
        
    • dn 成为 d 中的标识符

    •   
    • varAlreadyDeclared 成为调用 env的 HasBinding具体方法传递 dn 作为参数的结果。

    •   
    • 如果 varAlreadyDeclared 为false,则

           
          
      • 调用 env的 CreateMutableBinding具体方法,将 dn configurableBindings 作为参数传递。

      •   
      • 调用 env的 SetMutableBinding具体方法,将 dn ,undefined和 strict 作为参数传递。

      •   
    •   
  •   

由于您无法以编程方式访问作用域的词法环境,因此无法看到这些绑定。但这意味着您可以将局部变量视为此不可见对象的属性,就像全局变量成为全局对象的属性一样(您可以访问)。

在上面引用的部分的开头很好地总结了这个概念:

  

每个执行上下文都有一个关联的VariableEnvironment。在执行上下文中评估的ECMAScript代码中声明的变量和函数将作为VariableEnvironment的环境记录中的绑定添加。

要更详细地了解该过程,请查看specification of the CreateMutuableBinding and setMutableBinding方法。

为了回答你的实际问题,在这种情况下,“实现定义的对象”是当前执行上下文的词法环境。

答案 1 :(得分:3)

想想一个没有暴露给我们的抽象对象。它由实现定义,仅可用于实现 - “实现”意味着将运行代码的JavaScript引擎。

例如,请考虑以下函数:

function f(a,b) {
    var foo = 5;
    return a + b + foo;
}

在该函数范围内定义的变量和参数可以表示为如下所示的对象:

{
    a,
    b,
    foo
}

在执行函数期间,对象属性的值可能会发生变化。例如,如果使用f(1,2)调用该函数,则只要函数执行开始,对象就会如下所示:

{
    a: 1,
    b: 2,
    foo: undefined
}

foo分配5后,它将如下所示:

{
    a: 1,
    b: 2,
    foo: 5
}

将此对象视为在函数内声明。因此,您可以在函数内部访问abfoo的值,但不能在其外部访问。