js 当中的词法环境、执行上下文、活动对象 AO、变量对象 VO、作用域、[[scope]]的概念和区别? - V2EX
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 4827 次点击
    这是一个创建于 2778 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    在讨论闭包问题的时候,通过返回 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     Solana     4365 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 01:02 PVG 09:02 LAX 18:02 JFK 21:02 Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86