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
标签:闭包,count,场景,console,函数,function,js,test1,test From: https://www.cnblogs.com/susu2020/p/18159671