js 闭包的概念及应用场景
1.概念
是内部函数可以访问外部函数作用域中的变量。
2.来由
由于JavaScript中的函数作用域规则和函数可以作为值传递的特性产生的
3.优点
- 封装性(可以将变量和函数封装起来,防止外部访问和修改,提高了代码的可维护性和可重用性)
- 保存状态(即使函数已经执行完毕,状态仍然保存,在事件处理程序可以使用)
4.缺点
- 内存占用(他会保存内部函数的引用和外部函数的变量,如果没有及时释放闭包,会造成内存泄漏)
- 性能问题(由于会保存外部函数的变量,导致不能被垃圾回收,尤其是在循环中)
5.常见问题
- 内存泄漏
- 代码不易理解和调试(闭包使用函数的作用域扩大,内部函数可以访问外部函数的变量,会增加代码的复杂度)
6.应用场景
- 封装私有变量和方法
闭包可以用于创建模块化的代码,可以隐藏变量和方法,只暴露需要的接口,这样可以避免全局命名空间污染,并且可以增加代码的可维护性。
var test=(function(){
var count = 0;
function increment() {
count++;
console.log(count);
}
function decrement() {
count--;
console.log(count);
}
return {
increment: increment,
decrement: decrement
};
} )()
test.increment(); // 输出 1
test.increment(); // 输出 2
test.decrement(); // 输出 1
- 保存函数状态
即使函数已经执行完毕,状态任然保存。例如在事件处理程序中保存计数器状态,非常有用
function test() {
var count = 0;
return function() {
count++;
console.log(count);
};
}
let test1=test();
let test2=test();
test1(); //1
test1(); //2
test2(); //1
test2() //2
- 实现函数柯里化
就是将多个参数的函数转化为接受单个参数的函数,形成函数链
function test(x){
return function(y){
return x+y
}
}
let test1=test(2);
console.log(test1(3)); //5
console.log(test1(5)) //7

浙公网安备 33010602011771号