作用域链与原型链

作用域链

1、什么是作用域链
当代码在一个环境中执行时,会创建变量对象的一个作用域链。
由子级作用域返回父级作用域中寻找变量,就叫做作用域链。

作用域链中的下一个变量对象来自包含环境,也叫外部环境。而再下一个变量对象则来自下一个包含环境,一直延续到全局执行环境。全局执行环境的变量对象始终都是作用域链中的最后一个对象。
作用域链前端始终都是当前执行的代码所在环境的变量对象,如果环境是函数,则将其活动对象作为变量对象。
2、作用域链的用途
是保证执行环境有权访问的所有变量和函数的有序访问。
3、怎么延长作用域链
执行环境的类型只有两种,全局和局部(函数)。但是有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。
具体来说就是执行这两个语句时,作用域链都会得到加强。
作用域链与原型链

原型链

1、什么是原型链
当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。
2、原型链的用途
主要是继承的作用,简单来说,继承,就是子类继承父类的方法和变量;原型上可以定义一些方法和变量;以这个原型建立的对象,可以使用原型方法和变量,从而实现继承。
作用域链与原型链

它们的区别

  1. 作用域是对于变量而言,原型链是对于对象的属性。
  2. 作用域链顶层是window,原型链顶层是Object。
  3. 作用域是针对变量的,比如我们创建了一个函数a,函数A里面又包含了一个函数b,那么现在就有三个作用域:全局作用域==>函数a作用域==>函数b作用域,作用域的特点就是,先在自己的变量范围中查找,如果找不到,就会沿着作用域往上找。
  4. 原型链是针对构造函数的,比如我先创建了一个函数,然后通过一个变量new了这个函数,那么这个被new出来的对象就会继承创建出来的那个函数的属性,然后如果我访问new出来的这个对象的某个属性,但是我并没有在这个new出来的对象中定义这个变量,那么它就会往上(向创建出它的函数中)查找,这个查找的过程就叫做原型链。
    Object ==> 构造函数1 ==> 构造函数2