请教作用域与变量对象的关系◔ ‸◔?

犀牛书和红宝书中都没有对作用域的概念进行解释。对作用域的概念有些模糊。
汤姆大叔 的博客中解释了 变量对象 的含义,是JavaScript用来保存变量和函数的一个机制,文中说:

在具体实现层面(以及规范中)变量对象只是一个抽象概念

而在这篇文章中,却说:

变量对象成为“作用域”这个抽象概念的实体

另外,在segmentfault用户学习笔记中看到这样的理解:

我的理解是,作用域链是由一个一个变量对象链接起来的一个链,整个作用域链构成了当前执行环境中变量和函数可访问的范围,即作用域

请问大家:

  1. 作用域到底指的是什么?和变量对象的关系是什么?

  2. 变量对象与作用域,到底谁是谁的抽象概念?谁是具体实现?

谢谢回答。

阅读 3.4k
3 个回答
  1. 所以说啊……没有基础就开始看这些非常理论非常形式化的东西很容易把人搞晕……我不是贬低楼主,楼主有求知欲是好事情,也没有囫囵吞枣的接受他人的说法,这点挺好的,只是没有必要在这些文章上花太多时间。

  2. 也并不是说写那些文章的人写的不对,而是他们看待问题的角度并不一样,并且穿插了很多自己的想象。

  3. 他们设法不牵扯到具体实现,而是从纯粹抽象的语言层面来解释这个问题,自然就变得有点五花八门,看的人有点摸不着头脑。

  4. 这个东西实际上在计算机系有一门专门的课程《编译原理》,有兴趣你可以去翻翻公开课,或者看看这本书:编译原理

  5. 《你不知道的JS》系列的第二部《作用域与闭包》,就简单的从编译原理的角度简单的介绍了这个问题,相比上面那本大部头,这本书可能更容易让人接受吧。

好吧我来打个岔。。。

变量对象这个东西真的不值得讨论,因为已经完全过时了。这个概念是在ECMA-262-3提出的(1999年哦),从ECMA-262-5开始就被lexical environments(aka词法环境)所取代了。

目前最新的标准ECMA-262-7继续使用lexical environments并对其进行了比较详细的说明:ECMA-262 7th Edition

好了,学习去吧。。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏