ECMA-262-5 词法环境:ECMA实现(四)--- 标识符解析及其他

标识符解析

标识符解析是指使用正在运行的执行上下文中的词法环境组件,通过标识符获得其对应的绑定的过程。

  换句话说,这一个作用域链查找过程。如前所述,这类似于原型链的查找,而在这里是通过词法环境的outter属性。
 看下面这个例子:

var a = 10;
 
(function foo() {
  var b = 20;
  (function bar() {
    var c = 30;
    console.log(a + b + c); // 60
     
  })();
 
})();

 对于标识符a的解析算法过程如下:

function resolveIdentifier(lexicalEnvironment, identifier) {
  
  // 如果这是链的末端,而且没有找到绑定
  // 抛出ReferenceError
  if (lexicalEnvironment == null) {
    throw ReferenceError(identifier + " is not defined");
  }
  
  //返若是存在回绑定,一个reference类型的值
  // 稍后我们能从这个reference中获取绑定值
  if (lexicalEnvironment.hasBinding(identifier)) {
    return new Reference(lexicalEnvironment, identifier);
  }
  
  //或者寻找父作用域
  //递归的寻找外部环境
  return resolveIdentifier(lexicalEnvironment.outer, identifier);
 
}
 
resolveIdentifier(bar.[[LexicalEnvironment]], "a") ->
 
-- bar.[[LexicalEnvironment]] - not found,
-- bar.[[LexicalEnvironment]].outer (i.e. foo.[[LexicalEnvironment]]) -> not found
-- bar.[[LexicalEnvironment]].outer.outer -> found reference, value 10

结论

 这一章我们讨论ECMAScript中词法环境的概念。同样解释了为什么要把老版概念中变量/激活 对象以及作用域链变成现在的链式词法环境----最重要的原因是新的定义带来更高效的实现。
 我们也看到了,词法环境和闭包紧密关联在一起(再次说明,ECMAScript中函数表达式和函数声明都是闭包)。再次解释this的概念以及它在不同执行上下文是如何运作的。
 此外,我们也说了一些在未来ES版本中计划实现的东西。例如,移除全局对象。希望上一章的词法环境通用理论介绍能够帮助你了解这些概念的细节。

附录

额外阅读链接:

ECMA-262-5 specification:
扩展阅读
其他

原文链接

ECMA-262-5 in detail. Chapter 3.2. Lexical environments: ECMAScript implementation.

词法环境理论:文章列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值