企业手机网站源码下载云服务器和虚拟主机有什么区别
2026/4/8 11:25:48 网站建设 项目流程
企业手机网站源码下载,云服务器和虚拟主机有什么区别,在线平面设计兼职,钓鱼转转网站在线生成闭包原理#xff1a;从变量作用域到闭包的 3 个实际用途#xff08;以计数器为例#xff09; 点击这里观看课程 一、前置知识#xff1a;理解变量作用域#xff08;闭包的基础#xff09; 要理解闭包#xff0c;首先要搞清楚变量作用域——变量能被访问的范围#xf…闭包原理从变量作用域到闭包的 3 个实际用途以计数器为例点击这里观看课程一、前置知识理解变量作用域闭包的基础要理解闭包首先要搞清楚变量作用域——变量能被访问的范围主要分为两种1. 全局作用域定义在函数外部的变量整个程序都能访问和修改容易造成变量污染。示例letcount0;// 全局变量functionadd(){count;console.log(count);}add();// 输出 1add();// 输出 2count100;// 全局变量可被随意修改导致计数器逻辑混乱add();// 输出 101不符合计数器预期2. 函数作用域局部作用域定义在函数内部的变量只有函数内部能访问外部无法直接修改更安全但函数执行后变量会被销毁。示例functionadd(){letcount0;// 局部变量count;console.log(count);}add();// 输出 1函数执行后 count 被销毁add();// 输出 1重新创建 count 并赋值 0问题全局变量不安全局部变量无法保留状态——闭包就是解决这个矛盾的核心方案。二、闭包的核心原理1. 闭包的定义闭包是指内层函数可以访问外层函数作用域中的变量即使外层函数已经执行完毕。简单来说外层函数包裹内层函数内层函数引用外层函数的局部变量外层函数返回内层函数。此时外层函数的作用域不会被销毁变量会被“保留”且外部无法直接修改只能通过内层函数操作。2. 闭包的核心逻辑以计数器为例// 外层函数创建计数器的“容器”functioncreateCounter(){letcount0;// 外层函数的局部变量被内层函数引用// 内层函数操作局部变量的逻辑functionincrement(){count;returncount;}returnincrement;// 返回内层函数形成闭包}// 使用闭包创建计数器constcountercreateCounter();console.log(counter());// 输出 1count 保留了上一次的状态console.log(counter());// 输出 2console.log(counter());// 输出 3// 无法直接修改 count保证数据安全console.log(count);// 报错count is not defined原理拆解执行createCounter()时创建局部变量count和函数increment返回increment函数并赋值给counter此时createCounter执行完毕但因为increment引用了count所以count不会被垃圾回收每次调用counter()都会访问并修改同一个count实现状态保留。三、闭包的 3 个实际用途用途 1保留函数状态核心用途如计数器/累加器除了基础计数器还可以扩展为带初始值的计数器适配更多场景functioncreateCounter(initialValue0){letcountinitialValue;return{increment:(){count;returncount;},decrement:(){count--;returncount;},reset:(){countinitialValue;returncount;},getCount:()count// 只读访问避免直接修改};}// 示例创建初始值为 10 的计数器constmyCountercreateCounter(10);console.log(myCounter.increment());// 11console.log(myCounter.decrement());// 10console.log(myCounter.reset());// 10console.log(myCounter.getCount());// 10用途 2封装私有变量模拟“私有属性/方法”JavaScript 原生没有private关键字闭包可以实现变量私有化只暴露指定的操作方法functioncreatePerson(name){// 私有变量外部无法直接访问letage0;// 暴露的公共方法return{getName:()name,growUp:(){age;returnage;},getAge:()age};}constpersoncreatePerson(小明);console.log(person.getName());// 输出 小明console.log(person.growUp());// 输出 1console.log(person.age);// 输出 undefined私有变量无法直接访问用途 3防抖/节流前端高频场景利用闭包保留状态闭包可以保留防抖/节流函数中的定时器、上次执行时间等状态避免全局变量污染// 防抖函数频繁触发时只执行最后一次functiondebounce(fn,delay){lettimernull;// 闭包保留定时器状态returnfunction(...args){clearTimeout(timer);// 清除上一次的定时器timersetTimeout((){fn.apply(this,args);},delay);};}// 用法监听窗口resize避免频繁触发window.addEventListener(resize,debounce((){console.log(窗口大小改变了);},500));四、闭包的注意事项内存泄漏风险闭包会保留外层作用域的变量若长期不释放如全局变量引用闭包可能导致内存占用过高。解决不再使用时手动将闭包引用赋值为null如counter null。性能问题闭包的作用域链查找比普通变量慢高频执行的代码需谨慎使用。避免滥用不是所有场景都需要闭包简单的状态管理可优先用其他方式如 React 的 useState、Vue 的 ref。总结闭包核心内层函数引用外层函数的局部变量使外层变量在函数执行后不被销毁实现状态保留和私有化核心用途保留函数状态计数器、封装私有变量、实现防抖/节流等高频前端功能使用注意避免内存泄漏不滥用闭包根据场景选择最优方案。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询