作用域链
如果要理解作用域链就要先理解作用域,所以要先明白作用域
一、作用域
作用域就是变量与函数的可访问范围
即作用域控制着变量与函数的可见性和生命周期
二、作用域分为全局作用域和局部作用域
全局作用域:代码在程序的任何地方都能被访问,window 对象的内置属性都拥有全局作用域。
局部作用域:在固定的代码片段才能被访问。函数内部的声明式函数也是局部函数
三、[[scope]]
[[scope]]: 每个JavaScript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供JavaScript引擎存取,
[[scope]]就是其中一个,[[scope]]指的是我们所说的作用域,其中存储了运行期上下文集合;
四、作用域链
作用域链: [[scope]]中所存储的执行期上下文对象集合,这个集合呈链式链接,我们把这种链式链接叫做作用域链;
逐层衍生、逐层嵌套的作用域拥有以下的特性:
1.外层作用域无法调用内层作用域的变量和常量
2.代码执行需要时,优先引用当前所在执行环境中的变量和常量
3.直至追溯到最外层作用域( window 或 global)仍未定义的引用,即为 not defined.
原型链
JavaScript的所有对象中都包含了一个 __proto__内部属性,这个属性所对应的就是自身的原型,实例与原型之间的链条形成的链式结构叫做原型链
1.prototype
prototype是函数独有的属性,它从一个函数指向另一个对象,代表这个对象是这个函数的原型对象,这个对象也是当前函数所创建的实例的原型对象。
2.proto
__proto__属性是对象(包括函数)独有的。__proto__属性是从一个对象指向另一个对象,即从一个对象指向该对象的原型对象(也可以理解为父对象)
3.constructor
constructor是原型对象有的属性,它是从一个对象指向一个函数的。指向的函数就是该对象的构造函数。
原型链的一些特点
1.所有的实例的__ proto __ 都指向该构造函数的原型对象(prototype)。
2.所有的函数(包括构造函数)是Function的实例,所以所有函数的__ proto __的都指向Function的原型对象。
3.所有的原型对象(包括 Function的原型对象)都是Object的实例,所以__ proto__都指向 Object(构造函数)的原型对象。而Object构造函数的__ proto __指向 null。
4.Function构造函数本身就是Function的实例,所以__ proto __指向Function的原型对象。
当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。