js 当中的词法环境、执行上下文、活动对象 AO、变量对象 VO、作用域、[[scope]]的概念和区别?

2018-03-15 17:17:06 +08:00
 vevlins

不清楚这些概念,我在下面笼统地用作用域来描述。

与之相关的还有一个问题:

在讨论闭包问题的时候,通过返回 function 形成一个新的作用域,并且由于作用域链这个新的作用域能够取到上级作用域的量。这里是在新作用域内加了一个这个量的引用还是在内存中新建了一个量? 上级作用域是否依然存在,如果存在,那上级作用域中没有被用到的量在内存中清除了吗?

4521 次点击
所在节点    JavaScript
9 条回复
attackonFourier
2018-03-15 17:52:32 +08:00
这一本书讲的东西 你想在 V2EX 上讲清楚?
popbones
2018-03-15 19:37:52 +08:00
我不懂 JavaScript,以下是我猜的

引用;可能存在可能不存在看上下文;没有清除(一般都要引用计数的吧)
vevlins
2018-03-15 19:45:45 +08:00
@popbones 或者说它保留的是一整个作用域还是针对特定使用到的值。比如上级有 a、b 两个量,下级使用了闭包取到了 a,而 b 在之后一直没有再被用到,那么 b 以及上级其他用不到的量会销毁吗
popbones
2018-03-15 20:09:39 +08:00
设计原理上来讲闭包就是函数和函数的 context,至于是整个作用于都放到 context 里面还是只放用到的引用我觉得语义上没什么差别,更多是实现起来的差别,毕竟你没用到的量你你也访问不了呀。不过我写 JavaScript 没几天,我这是对一般语言设计类似的经验觉得的
vevlins
2018-03-15 20:16:31 +08:00
@popbones 谢谢了
l1093178
2018-03-15 20:20:37 +08:00
楼主要是对这个问题感兴趣的话,可以去看一下 https://www.coursera.org/learn/programming-languages 这个课程
xycd
2018-03-17 00:21:28 +08:00
可以看,
作用域,词法作用域 :《你不知道的 javascript 上卷》 1-2 章,编译和词法作用域;
执行上下文、活动对象 AO、变量对象 VO、作用域:《 javascript 高级程序设计》 第四章
变量对象 ,[[scope]]:《 javascript 高级程序设计》 P179 7.2 闭包 那节


变量对象 :就是执行环境中包含了所有变量和函数的对象。解析器在后台使用它,保存在内存中,代码无法直接访问。后台的每个执行环境都有一个表示变量的对象---变量对象。

活动对象: 当执行环境是函数时,将其活动对象作为变量对象。
当某个函数被调用时,会创建一个执行环境( execution context )及相应的作用域链。
然后,使用 arguments 和其他命名参数的值来初始化函数的活动对象( activation object )

[[scope]]:创建一个函数的时候,会创建包含全局变量对象的作用域链,该链保存在内部的[[scope]]属性中。调用函数的时候,为函数创建一个 执行环境,然后通过复制函数的[[scope]]属性中的对象构建起 执行环境 的作用域链。

作用域链:本质上是一个指向 变量对象 的指针列表,只引用 变量对象 。 详细看书。

执行环境( execution context )



垃圾回收机制 : 标记清除和引用计数
xycd
2018-03-17 00:28:01 +08:00
js 中的活动对象 与 变量对象 什么区别?
知乎的解答可以了
https://www.zhihu.com/question/36393048
vevlins
2018-03-17 03:21:23 +08:00
@xycd 万分感谢🙏!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/438395

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX