一、什么是闭包?
广义上:一个函数就是一个闭包
二、怎么产生闭包的?
如果一个函数访问了此函数父级以及以上的作用域变量,那么这个函数就是一个闭包。
但是实现闭包最常见的方式是函数嵌套(当一个嵌套的内部函数引用了外部函数的变量或函数时,就产生了闭包)
var a=1;
(function() {
console.log(a);
})();
三、闭包有什么作用?
闭包的作用:①使函数内部的变量在函数执行完之后仍然存放在内存中,延长了局部变量的声明周期 ;② 让函数外部可以操作(读写)到函数内部的数据
注意:闭包不可以滥用,会造成内存泄漏
function sum() {
var s=0;
return function(){
s++;
console.log(s);
}
}
sum()();//1
sum()();//1
var r=sum();//在这一步变量执行之后没有销毁( s还在 ),延长了S的生命周期
r();//1
r();//2 让函数外部可以操作(读写)到函数内部的数据
四、闭包的常见使用场景
1. 使 setTimeOut 支持传参
function fn(p){
return function(){
console.log(p);
}
}
var f1=fn(123);
setTimeout(f1,1000)
2. 封装私有变量或方法
var count=(function(){
var privateVar=0;
function changeVar(){
privateVar++;
}
return {//count是函数的返回值 是一个对象
add:function(){
changeVar();//私有方法
},
showValue (){
return privateVar;//私有属性
}
}
})();