小识闭包【2013/07/18】
想写关于闭包的博文很久很久很久了,久到我忘了写了,现在补回来……
闭包,closure, 一个挺形象的词, 初学的时候,感觉就像大门就在前面,但是要向左转再向右转再左转再右转再转转转才能进去一样——好啦,铺垫完了,别被吓到,其实闭包还是挺容易懂的。
首先,先简单明确一下变量的作用域。
javascript 变量无非就两种: 全局变量和局部变量。
同其他语言类似,全局变量的作用域是整个文件,局部变量只作用于声明它的函数内。
js 是弱语言类型,声明全局变量的时候不需要声明为var 变量 ,而局部变量则必须用var 声明。
Action...
1 什么是闭包?
我自己的简单理解,闭包就是一个函数里面包着另外一个函数(子函数),然后返回这个函数,这样,这个子函数就能读取局部变量了。所以,我们可以认为闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在,从存储上说,闭包就是函数的堆栈在函数返回后并不释放,我们可以认为这些函数是在堆上分配的。简言之,当一个函数内定义了另外一个函数,就会产生闭包。
下面用一个通俗易懂的例子来帮助大家认识闭包:
你已经看到个神奇的东西了,函数b嵌套在函数a内部,函数a的返回值是b!
执行完 var c = a();之后,变量c 实际上指向了函数b,再执行下去,就会打印出result:1
。这样就创建了一个闭包,因为函数a外的变量c引用了函数a内部的函数b。还是不懂???继续看……
2 为什么要用闭包?
闭包使得js的垃圾回收机制不会收回a所占用的资源,因为b的执行需要依赖a中的变量i,所以,i 始终存在,这有点类似于 C语言中的静态变量,每次执行完c(); i都自加了1.
1) 闭包保护了函数内的变量安全。回到刚刚那个例子,函数a中的i只有函数b才能访问,其他途径无法访问,因此保护了i 的安全性
2) 因为每次执行c(); , i 都自加了1,说明这是在内存中维持了i 这个变量。
3 闭包使用存在的问题
1)上面讲到闭包使得变量一直保存在内存中,这样的话,内存消耗就大了,所以,不能滥用闭包,否则讲导致网页的性能问题,在IE中也有可能会导致内存泄露。解决的方法:在退出函数之前,将不再使用的局部变量删除。
2)闭包函数会改变外层函数内部变量的值。
关于闭包,是js一个难点也是重点,需要不断深入学习!