详解JavaScript中的函数与闭包
闭包这东西,说难也难,说不难也不难,下面我就以自己的理解来说一下闭包。 一、闭包的解释说明 对于函数式语言来说,函数可以保存内部的数据状态。对于像C#这种编译型命令式语言来说,由于代码总是在代码段中执行,而代码段是只读的,因此函数中的数据只能是静态数据。函数内部的局部变量存放在栈上,在函数执行结束以后,所占用的栈被释放,因此局部变量是不能保存的。 Javascript采用词法作用域,函数的执行依赖于 变量作用域 , 这个作用域是在定义函数时确定的 。因此Javascript中函数对象不仅保存代码逻辑,还必须引用当前的作用域链。Javascript中函数内部的局部变量可以被修改,而且当再次进入到函数内部的时候,上次被修改的状态仍然持续。这是因为因为局部变量并不保存在栈上,而是通过一个对象来保存。 决定使用哪个变量是查找作用域链后决定的。 1.每次 定义函数时 ,都会为之创建一个作用域链; 2.每次 调用函数时 ,会创建一个新的对象用来保存变量(局部变量和参数),并且把这个用于保存变量的对象加入作用域链前端。 如果没有局部变量的话,这个保存变量的对象就只包含arguments,也就是用来保存参数。设想这么一种情况,如果内层函数定义时恰逢外层函数正被调用执行,那么内层函数就会把外层函数运行时这个保存变量的对象纳入自己的作用域链中。 用代码来举例,外层匿名函数执行了10次