做为小白入坑的这段时间,这三个概念很早便深刻我心,可是却总感受模模糊糊不知道该怎么讲清楚其中的关系,甚至有时候还会混淆,正好今天拿出来复盘一下。javascript
简单直白的讲执行上下文就是一种环境。html
类比一个卖猪肉的宇宙人小明,小明今天想要卖猪肉,那么首先宇宙是最根本的环境,在宇宙茫茫星海中他选择了在地球上卖,因此他来到了地球,在地球这么多的地方选择了中国某县的猪肉铺。至此他就开始卖猪肉了。你想一想看,很大的空间里,小明先把宇宙压入栈底,然后把存在与其中的地球又压入栈内,而后又把地球中的中国某县压入栈内部。是否是很像执行环境的压栈操做?当他在某县赚够了码农的钱后被宇宙警察发现非法卖肉,便准备溜了,先从某县走出,而后逃离地球,最后跑出宇宙。java
(出入栈操做)网络
在每一个执行上下文环境中都会提供一些变量。这是否是很像每一个环境独有的物质基础?好比在地球这个执行上下文环境中还有其余一些地方可供选择,在某县卖肉的时候你须要的砍刀不就是这个环境提供给你的变量?闭包
回顾一下:每一个执行上下文是一种环境,这种环境有大有小(大小指的是内部包含的变量多少)在调用某个函数时就将这个函数的执行上下文压入栈中,同时执行上下文中的变量对象被激活可用变为活动变量。函数调用完毕就把此函数的执行上下文出栈,固然连同这个环境中的变量对象一块儿被踢出局,同时激活当前栈顶的执行上下文的变量对象。函数
做用域链就是一种寻找变量的链条关系,每一个执行上下文中包含本环境中的变量对象并建立链条指向他的前一做用域。spa
接上个例子,小明在某县猪肉铺卖猪肉的时候,为了杀一头猪妖,他必须找到一把锋利的宝刀,可是寻遍了中国某县也没有适合的刀,因而他考虑是去日本打造一把军刀仍是在宇宙深处找一找有没有适合的刀?犹豫不决,可是他毕竟是个商人,为了把刀出去大动干戈还花钱,不如就地球内随便找把刀吧,但必须是他要的那个独一无二的类型才能发挥他杀猪的最高境界!因而他在地球某处终于找到了那把绝世宝刀!顺利杀妖抱得美人归。prototype
至此,咱们来分析一下:小明杀猪妖就是调用某个函数解决实际需求,可是他须要某个独一无二的宝刀(变量),在中国某县并未找到(当前做用域中并无定义此变量),因而他不得已在地球范围内寻找(顺着做用域链条在前一做用域中寻找),在地球中找到了!(前一做用域中找到了此变量),因而愉快的杀猪去了(找到了变量顺利解决了实际需求)。设计
回顾一下:做用域链是由每一个做用域连接成的呈链状变量对象集合,当前做用域不存在的变量就会依次向前一做用域寻找,直到在根做用域在寻找,而且只能按照必定的顺序寻找,不可以逆着顺序寻找。htm
原型链就是一种对象和建立此对象的对象之间的呈链式的关系链条。
仍是上个例子吧,小明以为卖猪肉太不赚钱,因而搞起了养殖业,他从某猪户中购得一怀了崽的猪,过了几天便下崽了,因而就变成了猪生猪代代相传。这个小明发现每一代猪都是俩而且这俩猪还只和他猪爸猪妈交流。
到这你们能够分析一下:这第一代怀了崽的猪就是null,后期由null产生了object与object.prototype这两个对象,再由这两个对象派生出了其余对象。或许一张图你会看得更明白。
回顾一下:原型链其实就是对象和本身父母的关系,父母在和爷奶的关系。每代之间会有特色添加进去,在你这里须要调用某个方法你却没有时,能够向上一直找寻找到后调用。
红宝书中讲:由多个执行上下文的变量对象构成的链表就叫作做用域链,因此做用域链表的产生是依附于执行上下文的变量对象的,根据每一个执行上下文有本身的做用域,然后根据压栈的关系组合成做用域链表。
原型链和他俩不掺合,原型链其实在构造对象的过程当中就已经产生了,除非手动的修改他的原型,这也是咱们平时在调用一些自带的API,并无写具体实现却能正常跑下来的缘由。
试想一下:如今写了一个函数,并无调用这个函数,那么如今有执行上下文吗?如今有做用域吗?如今有做用域链吗?如今有原型链吗?
执行上下文没有,执行上下文是调用时产生的。做用域已经存在了,书写完一个函数就肯定了函数本身的做用域。那么做用域链呢?固然是执行上下文压栈是才存在的。原型链也是函数写完时他就已经存在了,和是否调用该函数并没有关系。
感谢各位看官至此,但愿批评指正。
参考资料:
(图片来源于网络)