学了,也看了一些关于闭包的东西,做个总结,以备不时之需,可能有不足的地方,我对闭包也不是很了解。
一、什么是闭包?
闭包百度一搜,会有太多的解释。
闭包就是嵌套在函数里面的内部函数,并且该内部函数可以访问外部函数声明的所有局部变量、参数、和其它内部函数。当该内部函数在外部函数被调用时就生成了闭包。
说了一堆,举例说明:
function wai(){
var num=1;
function nei(){
alert(num);
}
return nei;
}
nei()函数就是一个闭包。
var fn=wai();
fn(); //1, 相当于wai()()
二、好处
1、可以读取函数内部的变量,
2、可以让这些局部变量保存在内存中,实现变量数据共享。
还是以上面的代码分析,第一个好处,nei()函数可以访问外部函数的变量num
第二个好处:
function wai(){
var num=1;
function nei(){
alert(num);
num++;
}
return nei;
}
var fn=wai();
fn(); //1
fn(); //2
fn(); //3
fn(); //4
不断递增,这就实现了变量数据共享。
三、缺点
1、由于闭包会使得函数中的变量都保存在内存中,一方面会使内存消耗大,另一方面在ie下导致内存泄露(不太懂,但是听上去感觉很严重的样子),结局办法,在退出函数时,将不使用的局部变量全部删除(null掉吧)
2、闭包会在父级外部,改变父函数内部内部变量的值(例子中的num);所以,如果你把父函数当作对象(object)使用,把闭包当做它的公用方法,把内部变量当做它的私有属性,这时你需要做的是,加倍小心,不要随便改变函数的值,否则你会后悔的。
四、总结
现在可能是学的也不深,对闭包真的感觉没有用到,所以也没有切身的体会,一直被听说,不明觉厉