关于scope chain与prototype chain的一些理解
关于scope chain与prototype chain的一些理解
scope chain
1.函数是对象,当一个函数创建时,有一个内置属性[[Scope]]自动创建只提供给js引擎读取,纪录了这个函数的scope chain的一个集合,里面的每一个元素叫做variable object
2.当函数执行时,自动创建一个excution context,它里面也会创建一个scope chain的集合,它是复制函数的[[Scope]]属性,并且在它0的位置添加一个activation object
3.这个activation object包含了this和arguments引用,整个excution context里的scope chain当告诉函数如何读取和修改数据,所有的数据都在这个scope chain集合里
4.当函数执行完毕,excution context destroyed,它里面的scope chain也destroyed,scope chain里的activation object也destroyed
prototype chain
1.一个对象实例有instance members与prototype members,而function object由于暴露了prototype,则可以实现经典的伪类继承,实际上只是将实例对象的prototype引用到另一个对象上(个人喜欢将其包装起来,没有显示的prototype和new)
2.而非function object instances没有直接可操作的prototype对象,虽然有些browser有__proto__,但毕竟ie没有
3.Object.prototype.prototype是null,因此原型链到此结束,原型链本质是一系列的引用链,由于每创建一个对象或者函数系统都会自动创建这样一个prototype对象的引用,所以js的继承就是如此简单
总结:
scope chain与prototype chain前者是解决了变量的查寻方案,后一个是解决了对象属性的查寻方案,一个用于闭包,另一个用于继承,而在js中第三个重要的概念就是context,说白了就是如何将函数/方法里的this绑定到正确的对象上,这里就需要用到apply/call这些函数方法了,是用于代码重用。