理解做用域链和原型链

做用域链的概念:web

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

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

 

原型链的概念:prototype

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

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

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

相关文章
相关标签/搜索