js 闭包的概念及应用场景
1.概念
是内部函数可以访问外部函数作用域中的变量。
2.来由
由于JavaScript中的函数作用域规则和函数可以作为值传递的特性产生的
3.优点
- 封装性(可以将变量和函数封装起来,防止外部访问和修改,提高了代码的可维护性和可重用性)
- 保存状态(即使函数已经执行完毕,状态仍然保存,在事件处理程序可以使用)
4.缺点
- 内存占用(他会保存内部函数的引用和外部函数的变量,如果没有及时释放闭包,会造成内存泄漏)
- 性能问题(由于会保存外部函数的变量,导致不能被垃圾回收,尤其是在循环中)
5.常见问题
- 内存泄漏
- 代码不易理解和调试(闭包使用函数的作用域扩大,内部函数可以访问外部函数的变量,会增加代码的复杂度)
6.应用场景
- 封装私有变量和方法
闭包可以用于创建模块化的代码,可以隐藏变量和方法,只暴露需要的接口,这样可以避免全局命名空间污染,并且可以增加代码的可维护性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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 |
- 保存函数状态
即使函数已经执行完毕,状态任然保存。例如在事件处理程序中保存计数器状态,非常有用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 |
- 实现函数柯里化
就是将多个参数的函数转化为接受单个参数的函数,形成函数链
1 2 3 4 5 6 7 8 9 | function test(x){ return function (y){ return x+y } } let test1=test(2); console.log(test1(3)); //5 console.log(test1(5)) //7 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类