V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
vevlins
V2EX  ›  JavaScript

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

  •  
  •   vevlins · 2018-03-15 17:17:06 +08:00 · 4544 次点击
    这是一个创建于 2481 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    9 条回复    2018-03-17 03:21:23 +08:00
    attackonFourier
        1
    attackonFourier  
       2018-03-15 17:52:32 +08:00
    这一本书讲的东西 你想在 V2EX 上讲清楚?
    popbones
        2
    popbones  
       2018-03-15 19:37:52 +08:00 via iPhone   ❤️ 1
    我不懂 JavaScript,以下是我猜的

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


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

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

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

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

    执行环境( execution context )



    垃圾回收机制 : 标记清除和引用计数
    xycd
        8
    xycd  
       2018-03-17 00:28:01 +08:00
    js 中的活动对象 与 变量对象 什么区别?
    知乎的解答可以了
    https://www.zhihu.com/question/36393048
    vevlins
        9
    vevlins  
    OP
       2018-03-17 03:21:23 +08:00
    @xycd 万分感谢🙏!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2857 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:02 · PVG 22:02 · LAX 06:02 · JFK 09:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.