闭包的解释
当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这时就产生了闭包
在javascript中,只有函数内部的子函数才能读取局部变量,所以说,闭包可以简单理解成“定义在一个函数内部的函数“。所以,在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
闭包的特点:
1) 作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
2) 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
简单的说,javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
闭包应用场景
1.setTimeout
setTimeout(func,time)
这里的func不能带参数,解决这个问题需要用闭包
function func(param) { return function() { alert(param); } } var f = func(1) setTimeout(f, 1000);
2.代替全局变量
//闭包,test2是局部变量,这是闭包的目的 //我们经常在小范围使用全局变量,这个时候就可以使用闭包来代替。 (function(){ var test2=222; function outer(){ alert(test2); } function test(){ alert("测试闭包:"+test2); } outer(); //222 test(); //测试闭包:222 } )(); alert(test2); //未定义,这里就访问不到test2
3.为节点循环绑定click事件,在事件函数中使用当次循环的值或节点,而不是最后一次循环的值或节点
4.创建特权方法用于访问控制
使用闭包的注意点
(1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
(2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。