为了让大家能够很好的去理解js去怎么围绕内存来定义规则,我下面继续来解释js里很重要的一个规则。如果你看过我前面写的一篇“js如何根据内存开辟自己的规则(建房子理论)”的博文,我里面提到一个房子理论,你也可以用这个思想并以一种宏观的角度看我下面说的,上一篇“js围绕内存的规则定义”里解释了js是如何以自己定义的规则来在内存里开辟变量空间并放入数据,我们暂且以房子理论里面说的把它当成原材料,接下来是原材料有了,那js如何将这些原材料拼接并形成一个完整的体系的呢(白话就是js是如何将这些东西应用起来并让我们感知到的呢),我这里先把js规则里面定义的两个概念罗列出来:执行环境、作用域,为了帮助大家理解我接下里说的东西先看图一张:
解释上面的规则前,首先我们得知道一点就是js是依托浏览器开发出来的一门解释性的语言,在浏览器开启开始,CPU就在内存当中开辟了一块空间放置浏览器对象(在js规则下把他叫做window对象),我们可以看成var window={里面是各种内置的属性、内置的属性参数、内置的方法},因为这个window是引用类型的方式存储在内存中,说过引用类型的特殊性(伸缩性),所以js就规定我们可以在里面可以按照自己的想法增加、删除、修改操作,也就是说我们的代码就在window里面运行,js给这个window对象取了个很应景的名字叫执行环境,那按照这个思维延展下去,是不是我自己定义一个对象(很好应该叫引用类型内存空间,为什么这么叫,以后我会给出function、{}等几种引用类型在内存的异同点)也可以叫做执行环境呢,答案是肯定的,上图也反应出来了,但上图还清楚的告诉我们,执行环境嵌套着执行环境,那最外层的执行环境我们就叫它全局执行环境。所以小结一下上面的就是:浏览器加载初始给我自动创建了一个全局执行环境,而后我们自己根据自己的需求开创自己的执行环境(为什么可以这样创建,因为引用类型数据的伸缩性,js就是充分利用这点来开展自己的语言规则的)。
执行环境了解了后,我们会引入js定义给执行环境的几个概念:变量对象、作用域。js规定每个执行环境在内存里都隐含了一个属于它的变量对象,执行环境里定义的所有属性、方法都保存在这个变量对象中。好了,到了这里一个js静态视图就出来了,为什么叫静态视图,因为我们前面都是讲js怎么在内存中开辟某某东西和开辟的东西的一些硬性规定。那我们接下来讲js对代码运行阶段的规则定义,js规定代码进入了一个执行环境运行时,会给此执行环境的变量对象创建一个作用域,那js里面的作用域链是怎么形成的呢,这个作用域链有点像函数里面的递归,从父执行环境遇到下一个执行环境时,父执行环境终止,交给下一个执行环境,这里还有个规则,如果执行环境没有遇到下一执行环境并顺利执行完此执行环境,此执行环境就自动销毁(里面的属性也跟着销毁),控制权交给上一级执行环境,所以执行环境在递归的过程中一直带着的自己作用域递归,就形成了一条如图所示的作用域链,但基于js的单线程模式,所以当前作用域里面的变量是不能访问到自己子执行环境里面作用域的变量,但能访问到父执行环境作用域里的变量,所以作用域链就形成了单链向上访问的权限链条。
评论加载中...
|
Copyright@ 2011-2017 版权所有:大连仟亿科技有限公司 辽ICP备11013762-1号 google网站地图 百度网站地图 网站地图
公司地址:大连市沙河口区中山路692号辰熙星海国际2215 客服电话:0411-39943997 QQ:2088827823 42286563
法律声明:未经许可,任何模仿本站模板、转载本站内容等行为者,本站保留追究其法律责任的权利! 隐私权政策声明