对javascript的执行环境、变量对象、作用域链、环境栈等概念的综合分析

*下文对执行环境、变量对象、作用域链、环境栈的彼此相关的概念进行了综合分析,目的在于缕清它们的关系,并描述于此相对应的js执行机制。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

            在js中,执行环境是一个抽象出来的概念,可以理解为特定代码的执行场所,它定义了变量或函数可以访问哪些数据和不可以访问哪些数据(这也是这个环境所存在的意义)。

           每一个执行环境都对应于具体的一个变量对象(variable object),该环境中定义的所有变量都做为该对象的属性,所定义的所有函数都作为该对象的方法。
            !!!值得注意的是,变量对象仅供 js解析器 在处理数据时在后台引用,我们编写的代码是无法访问这个对象的;
            举个例子,全局环境是最外层的一个执行环境 ,它是由web浏览器提供的,又可以称为宿主环境, 对应着唯一的一个 变量对象,又称全局对象window,所有的全局变量和全局函数都是作为window对象的属性和方法而创建的.

----------------------------------------------------------------------------------------------------------------------------------------------------------------

            在JS中,作用域是针对特定执行环境而形成的作用域链而实现的。该作用域链可以认为是线性的,顺序的,链状的,针对不同执行环境而创建的,是变量对象的线性集合。这些变量对象包括:当前执行环境的,包含当前执行环境的执行环境......依次类推,直到宿主环境,即在程序结构上呈现嵌套包含关系的环境所对应的变量对象的集合。所以作用域链不仅包含当前执行环境的变量或函数,也包括包含该执行环境的环境所拥有的变量或函数....按顺序依次类推,直到宿主环境。作用域链的用途是保证当前执行环境中的代码对有权访问的所有变量和函数进行有序的访问,作用域链的最前端,永远是当前执行的代码所在环境的变量对象,标识符解析从最前端开始,沿着作用域链一级一级的向后搜索标识符,直到找到标识符为止(如果标识符未找到,那么就会报错),这便是作用域的实现原理。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        
            正如上述所提到的作用域链是变量对象的集合,环境也有其集合的概念,称为环境栈。由于任意的执行环境都对应于一个具体的变量对象,所以可以把作用域链从头到尾的每个节点(变量对象) 都映射为  与之对应的环境 ,形成一种新的线性结构。于此 , 作用域链和环境栈就如同基因位点相匹配对应的两条染色单体。 抽象的环境栈概念是为了方便描述执行环境的变更行为。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

             例如每个函数都有自己的环境。当执行流进入一个函数时,函数的环境就会被推入环境栈中。而在函数执行完之后,栈便会将其环境弹出,把控制权返回给之前的执行环境。    针对变量对象,与上述一 一对应的说法便是 :每个函数都有环境---->对应于一个变量对象。当执行流进入一个函数时,函数的环境就会被推入环境栈中 ---> 作用域链也会增加一个变量对象。函数执行完之后,栈将其环境弹出---->作用域链中对应的变量对象被砍掉。 
             !!!总合上述,或许也可以这样说,环境和变量对象既是一种一一对应的关系,也是一种此消彼长,相互依存的关系。


--------------------------------以上是本人在学习javascript时对相应概念的理解,如有不当之处,请不吝赐教---------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值