.
.
闭包,我个人理解就是在函数中的函数,内部的函数可以访问外部函数的变量,外部函数的变量就是内部函数的一部分。
闭包的概念
闭包就是能够读取其他函数内部变量的函数。
详细的来说,闭包是指有权访问另外一个函数作用域内部变量的函数。
.
有时候我们需要使用函数内部的局部变量,正常情况下是办不到的。通过闭包可以解决这个问题。
闭包的作用:
- 读取函数内部的变量
- 让这些变量的值保存在内存里面,实现数据共享(生命周期比较长)。
.
var cnt=(function(){
var i=0;
return function(){
alert(i);
i++;
}
})();
cnt(); // 0
cnt(); // 1
cnt(); // 2
cnt(); // 3
由此可见在第二次调用 cnt()
的时候,i = 1
这就证明了在 局部变量 i
一直保存在内存中,并没有在 cnt()
第一次调用之后被自动消除。
因为在 内部函数是外部函数的子函数,而内部函数被赋予了一个全局变量 i
,导致 内部函数一直存在,而内部函数的存在又依赖于外部函数,所以,外部函数也一直存在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
.
闭包的特性:
- 函数内部再嵌套函数
- 内部函数可以引用外层函数的参数和变量
- 参数和变量不会被垃圾回收机制回收
闭包的使用场景:
- 函数作为参数传递
- 函数作为返回值返回
.
函数作为参数传递
function f1(){
var num = 10;
return function () {
console.log('f1', num)
}
}
function f2(fn){
var num = 12
console.log('f2', fn())
}
var Fn = f1()
f2(Fn); // f1 10 此时的num取值为 10
.
函数作为返回值返回
function cnt() {
var i = 0;
return function add(){
i++;
console.log(i)
}
};
var f1 = cnt()
f1(); // 1
f1(); // 2
使用闭包注意事项:
- 因为闭包会使,函数中的变量一直保存在内存中,内存消耗大,所以不能滥用闭包,否则会导致内存泄露,影响网页的性能。(解决方法:闭包使用完了后,应该立即释放资源,将引用变量指向null。)
- 闭包会在父函数外部改变父函数内部的变量值。如果你把父函数当对象(object)使用,把闭包当做它的公共方法,把内部变量当做私有属性使用的时候,要注意不要随意修改父函数内部的变量值。
.
.
参考 https://www.cnblogs.com/chuntaoj/p/5996216.html