1、闭包定义
允许使用内部函数--即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
2、背景知识
对象
ECMAScript 认可两类对象
原生(Native)对象——属于语言
宿主(Host)对象——由环境提供
创建属性
可以动态、松散的给对象增加属性。
var obj=new Object(); //创建一个javascript对象
obj.testNumber = 5; //新建名为 “testNumber” 的属性,这个属性在赋值后才新建。
读取属性
var objectRef = new Object();
创建一个普通的 JavaScript 对象。该对象的原型为Object.prototype的对象,而Object.prototype的对象拥有一个值为 null 的原型。这样就构成了所谓的原型链。原型链终止于链中原型为 null 的对象。
当某个属性访问器尝试读取由对象的属性值时,整个原型链都会被搜索,如果没有找到任何对象有该属性,则最终返回undefined。
注意:ECMAScript 为 Object 类型定义了一个内部 [[prototype]] 属性。这个属性不能通过脚本直接访问,但在属性访问器解析过程中,则需要用到这个内部 [[prototype]] 属性所引用的对象链--即原型链。可以通过一个公共的 prototype 属性,来对与内部的 [[prototype]] 属性对应的原型对象进行赋值或定义。这两者之间的关系在 ECMA 262(3rd edition)中有详细描述,但超出了本文要讨论的范畴。