做用域是变量和函数生效的区域。分为全局变量和局部变量。函数外面不能访问函数里面的,函数里面的能够访问函数外面的。彼此独立的区间不能互相访问。 每一个js的函数都是一个对象,对象有些属性咱们能够访问,有些只能供js引擎存取,咱们访问不了。[[scope]]就是其中之一。scope就是咱们所说的做用域,其中存储了执行期上下文的集合。这个集合成链式结构,咱们把这个连式结构称做做用域链。 当函数执行的前一刻,会建立一个称为执行期上下文的内部对象。一个执行期上下文定义一个函数执行环境,函数每次执行对应的执行上下文都是独一无二的。因此屡次调用一个函数会致使建立多个执行期上下文,当函数执行完毕时候,执行期上下文就会被销毁。数组
预编译分为函数预编译和全局预编译 预编译总共有四个步骤,第一个先建立一个AO对象(activation object),也叫做执行期上下文。第二个找到形参和变量声明,将变量和形参名做为AO的属性,值为undefined。第三部是实参和形参相统一,把实参值传到形参中。第四部将函数声明提高,值赋给函数体。 全局预编译是首先建立一个GO对象(blobal object),window就是GO。AO上面没有就看GO.缓存
当内部函数被保存到外部时,将生成闭包,闭包会致使做用域链不释放,形成内存泄漏。闭包
构造函数必须用new 这个操做符,构造函数内部原理是使用new以后,里面会有三步隐式转换。app
原型是function对象的的一个属性,他定义了构造函数制造出来的对象的公有祖先。经过该构造函数产生的对象,能够继承原型的属性和方法。原型也是对象。 使用原型能够提取出来公有属性。对象属性的增删和原型上属性的增删改查。对象经过__proto__ 查看原型。对象可经过constructor查看构造函数。函数
函数的原型是另外一个构造函数,另外一个构造函数有原型,就造成原型链。原型链上的增删改查和原型基本一致,只有本人有的权限,资损失没有的。 谁调用的方法内部this就指向谁。绝大多数的对象最终都会继承自Object.prototype 除了 Object.create(null?原型)this