You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Genzhen, dihui-dpx, Jan-xao, hyukjaemi, fumq-dae and 52 morexgqfrmsJan-xao and MoYueLiGenzhen and MoYueLihui-te and qianduanzhouHush94 and wudizhuzhumeiGenzhen, daidi66, zhuchangfeng, suyulong15000971151, zeffon and 5 morezhuchangfeng, suyulong15000971151 and qianduanzhou
应用场景二说错了,都会弹出 3 是因为 var 的变量提升导致 i 提升成了函数作用域的变量而不是 for 作用域内的变量。解决方法不是创建闭包而是将 var 改成 let 防止循环变量提升成函数变量。
suyulong15000971151, ssthouse, sun0718, banchichen, tjkovo and 7 moresuyulong15000971151, usernamekun and zhuweileosuyulong15000971151suyulong15000971151suyulong15000971151 and Mr-Scqsuyulong15000971151suyulong15000971151suyulong15000971151
Activity
Genzhen commentedon Jun 23, 2020
1)什么是闭包
函数执行后返回结果是一个内部函数,并被外部变量所引用,如果内部函数持有被执行函数作用域的变量,即形成了闭包。
可以在内部函数访问到外部函数作用域。使用闭包,一可以读取函数中的变量,二可以将函数中的变量存储在内存中,保护变量不被污染。而正因闭包会把函数中的变量值存储在内存中,会对内存有消耗,所以不能滥用闭包,否则会影响网页性能,造成内存泄漏。当不需要使用闭包时,要及时释放内存,可将内层函数对象的变量赋值为null。
2)闭包原理
函数执行分成两个阶段(预编译阶段和执行阶段)。
利用了函数作用域链的特性,一个函数内部定义的函数会将包含外部函数的活动对象添加到它的作用域链中,函数执行完毕,其执行作用域链销毁,但因内部函数的作用域链仍然在引用这个活动对象,所以其活动对象不会被销毁,直到内部函数被烧毁后才被销毁。
3)优点
4)缺点
4)应用场景
应用场景一: 典型应用是模块封装,在各模块规范出现之前,都是用这样的方式防止变量污染全局。
应用场景二: 在循环中创建闭包,防止取到意外的值。
如下代码,无论哪个元素触发事件,都会弹出 3。因为函数执行后引用的 i 是同一个,而 i 在循环结束后就是 3
GolderBrother commentedon Jul 20, 2020
厉害
wkm940516 commentedon Jul 28, 2020
写的不错
850964517 commentedon Aug 10, 2020
cucurbitboy commentedon Sep 11, 2020
function foo () {
var a = 1;
function bar () {
a++;
console.log(a)
}
return bar
}
var b = foo()
setInterval(function(){
b()
},1000)
sweetliquid commentedon Nov 4, 2020
应用场景二说错了,都会弹出 3 是因为 var 的变量提升导致 i 提升成了函数作用域的变量而不是 for 作用域内的变量。解决方法不是创建闭包而是将 var 改成 let 防止循环变量提升成函数变量。
Genzhen commentedon Nov 5, 2020
@Genzhen 感谢提出见解
闭包可以缓存值,不被回收,也是这种场景的一种解决方案,在没有let之前,也是经常采用的
qianyong123 commentedon Dec 9, 2020
写的可以
meiyuesheng commentedon Mar 11, 2021
在vue中有个经常使用的场景,在事件回调中传入额外的值,比如for循环的index。
<element v-for="(item, index) in data>
<select @change="(value, option) => selectChange(value, option, index)">
woshiitdaniu commentedon May 16, 2021
闭包的应用场景非常多,只要用到了函数柯里化的地方就有闭包的身影,比如防抖节流、定时器、惰性处理等
2130902026 commentedon Sep 23, 2021
写的很全面,厉害啊 ,但是 闭包函数执行后返回的结果是一个内部函数 这... 有点不理解
zizxzy commentedon Nov 1, 2021
防抖和节流都用到了闭包
rambo-panda commentedon Jun 7, 2022
对象是有功能的数据结构。闭包是有数据的功能
Kisthanny commentedon Mar 20, 2024