微信公众号搜索关注:进入二开物,更多技术周刊、React技术栈、JavaScript/TypeScript/Rust等编程语言等你来发现……什么是闭包包?闭包的概念有很多版本,不同的地方对闭包有不同的看法。维基百科:在计算机科学中,闭包(英语:Closure),也称为词法闭包(LexicalClosure)或函数闭包(functionclosures),是在支持一等函数的编程语言中实现词法绑定的技术。MDN:闭包是函数和对其绑定词法环境的引用的组合。个人理解:闭包是一个函数(返回一个函数),返回的函数保存了对外部变量的引用一个简单的例子functionfn(){letnum=1;returnfunction(n){returnn+num}}letrFn=fn()letnewN=rFn(3)//4num变量作用域在fn函数中,但是rFn函数可以访问num变量,也就是说闭包函数可以访问外部函数变量。从浏览器调试和VSCodeNodejs调试看闭包浏览器VSCode配合Node.js看Closure中的fn是一个闭包函数,保存了num变量。一个经典的闭包:单线程事件机制+循环问题,以及解决方法for(vari=1;i<=5;i++){setTimeout(()=>{console.log(i);},i*1000);}输出结果都是6,为什么?for循环是一个同步任务setTimeout异步任务。对于循环一次,setTimeout异步任务会被添加到浏览器的异步任务队列中。同步任务完成后,会从异步任务中取出一个新的任务,在线程中执行。由于setTimeout可以访问外部变量i,当同步任务完成后,i已经变成了6,setTimeout中可以访问的变量i全部为6。方案一:使用let语句for(vari=1;i<=5;i++){setTimeout(()=>{console.log(i);},i*1000);}方案二:自执行函数+closurefor(vari=1;i<=5;i++){(function(i){setTimeout(()=>{console.log(i);},i*1000)})(i)}解决方案3:setTimeout传递第三个参数第三个参数的意思是:附加参数,一旦定时器超时,它们将作为参数传递给要执行的函数for(vari=1;i<=5;i++){setTimeout((j)=>{console.log(j);},1000*i,i);}闭包和函数套用函数add(num){returnfunction(y){returnnum+y;};};让incOneFn=add(1);让n=incOneFn(1);//2letdecOneFn=add(-1);让m=decOneFn(1);//0add函数的参数保存闭包函数变量。闭包的实际功能在函数式编程中起着非常重要的作用。lodash等早期的工具功能弥补了javascript的不足,闭包有大量的使用场景。使用场景创建私有变量,延长变量的生命周期。节流功能可防止滚动行为。过度执行功能需要节流。节流函数接受函数+时间作为参数,它们是闭包中的变量。以下是一个简单的setTimeout版本:functionthrottle(fn,time=300){vart=null;返回函数(){如果(t)返回;t=setTimeout(()=>{fn.call(this);t=null;},时间);}}防抖功能setTimeout防抖功能的简单实现functiondebounce(fn,wait){vartimer=null;returnfunction(){if(timer!==null){clearTimeout(timer);}timer=setTimeout(fn,wait);}}React.useCallback闭包陷阱问题描述:父子组件关系,父子组件可以同时使用点击事件修改状态数据,子组件获取传入的props事件属性,优化方式为使用回调。也就是说,这个优化函数有一个闭包陷阱,(保存初始状态值)import{useState,useCallback,memo}from"react";constChildWithMemo=memo((props:any)=>{return(
