闭包
概念
函数的返回值 为 被定义的函数,外部函数中 套 另一个函数,
优点:保证变量不会被全局污染,外部可以访问函数内部的变量
缺点:执行完毕后变量不会释放,容易造成内容溢出
原理: 因为作用域 以及函数赋值的特点
函数赋值特点
将一个定义的函数赋值给另一个变量XX,xx() 实际上执行的就是这个作用域以及父级作用域的值,如果为局部变量,
全局变量不会污染布局变量
function add(){
var x = 0;
console.log(x) //验证普通函数,变量释放
return function(){
console.log(++x) //验证闭包中函数,变量不释放
}
}
add() //0
add() //0
add() //0
add() //0
var rem = add();
rem() //1
rem() //2
rem() //3
rem( ) //4
使用闭包的注意点
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
- 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
闭包实例
下面这个是关于闭包的实例,请看
解释实例
function fun(n,o){
console.log(o);
return{
fun: function(m){
return fun(m , n);
}
};
}
var a = fun(0);
// //undefined 返回 a 对象 {fun:function(m){return fun(m,0)}}
a.fun(1);
// run(1,0) 0 {fun: function(1){...}} 返回对象
a.fun(2);
// 由对象 fun(2,0) 0 {fun:function(2){...}}
a.fun(3);
// 0
var b = fun(0)
//undefined 返回一个 b 对象 {fun:function(m){return fun(m,0)}};
.fun(1)
// 由 b 对象 转为 function(1){return fun(1,0)} --> fun(1,0) -->
// 0 再返回一个对象 {fun:function(m){return fun(m,1)}}
.fun(2)
// // function(2){return fun(2,1)} --> 1 {fun:function(m){return fun(m,1)}}
// .fun(3); //
// // function(3){return fun(3,1)} --> 1 {fun:function(m){return fun(m,3)}}
// function(2){return fun(2,1)} --> 1 {fun:function(m){return fun(m,2)}}
.fun(3); //
// function(3){return fun(3,2)} --> 2 {fun:function(m){return fun(m,3)}}
var c = fun(0).fun(1);
// undefined 返回一个 对象 {fun:function(m){return fun(m,0)}}
// 再运行 .fun(1) -->
// function(1){return fun(1,0)} --> 0 -->
// 再返回一个对象,也就是 c {fun:function(m) {return fun(m,1)}}
c.fun(2);
// 通过 c 对象,执行方法
// 执行 fun(2)
//---> function(2){return fun(2,1)} --> 1 -->
c.fun(3);
//1