理解作用域链和原型链

作用域链的概念:

  要理解ES中作用域链,首先要从理解执行环境开始。ES中代码执行都是在一个具体的执行环境中进行的,每个执行环境有一个与之关联的变量对象,该变量中包含着在这个执行环境中可以访问的变量和函数。这里所说的执行环境就相当于作用域。最外围的执行环境是全局环境,在web浏览器中也就是window对象。某个执行环境中的代码执行完毕之后,该环境会被销毁,包含在其中的所有变量和函数也会被销毁,而全局环境会在关闭网页或浏览器时才会被销毁。

  每个函数都有一个自己的执行环境,在执行时弹入环境栈,执行完毕之后弹出。因此当代码在某个环境中执行时会创建一个变量对象的作用域链。这个作用域链从当前环境的变量对象开始,指向其包含环境的变量对象,依次向前,直到全局对象window结束。在代码执行进行数据访问时,会沿着这条作用域链依次寻找标识符。因此全局环境只能访问全局变量和函数,而不可以访问函数中定义的数据,函数中的数据只可以在该函数的执行环境或者其从属环境中访问得到。

 

原型链的概念:

  原型是与构造函数相关的一个概念。在定义构造函数时,会产生一个prototype属性指向一个原型对象,原型对象中的属性即为该构造函数中定义的所有公共属性。实例对象则会包含一个指向其构造函数原型对象的指针,由此来共享公共属性。

  而js中所有对象都指向一个原始对象Object,这里使用到了继承的概念,也就是所有自定义对象都是继承自Object对象,可以直接使用Object对象的属性和方法。而继承就是通过原型链来实现的。

  假如让构造函数A的实例对象指向另一个构造函数B的原型对象,则通过A的实例对象就可以访问到B中定义的公共属性和方法,也就是A继承了B。以此类推,可以通过作用域链的依次访问实现多层继承,而他们最终都会指向Object。

posted @ 2017-10-24 17:02  随行笔记  阅读(699)  评论(0编辑  收藏  举报