javascript闭包是什么 闭包的作用

很长时间以来我对闭包都停留在“定义在一个函数内部的函数”这样肤浅的理解上。事实上这只是闭包形成的必要条件之一。直到后来看了大佬的《你不知道的 javascript》上册关于闭包的定义,我才豁然开朗:
当函数能够记住并访问所在的词法作用域时,就产生了闭包。
let single = (function(){
let count = 0
return {
plus(){
count++
return count
},
minus(){
count--
return count
}
}
})()
single.plus() // 1
single.minus() // 0
这是个单例模式,这个模式返回了一个对象并赋值给变量 single,变量 single 中包含两个函数 plus 和 minus,而这两个函数都用到了所在词法作用域中的变量 count。正常情况下 count 和所在的执行上下文会在函数执行结束时被销毁,但是由于 count 还在被外部环境使用,所以在函数执行结束时 count 和所在的执行上下文不会被销毁,这就产生了闭包。每次调用 single.plus()或者 single.minus(),就会对闭包中的 count 变量进行修改,这两个函数就保持住了对所在的词法作用域的引用。
闭包其实是一种特殊的函数,它可以访问函数内部的变量,还可以让这些变量的值始终保持在内存中,不会在函数调用后被垃圾回收机制清除。
看个经典案例:
// 方法 1
for (var i = 1; i <= 5; i++) {
setTimeout(function() {
console.log(i)
}, 1000)
}
// 方法 2
for (let i = 1; i <= 5; i++) {
setTimeout(function() {
console.log(i)
}, 1000)
}
方法 1 中,循环设置了五个定时器,一秒后定时器中回调函数将执行,打印变量 i 的值。毋庸置疑,一秒之后 i 已经递增到了 5,所以定时器打印了五次 5 。(定时器中并没有找到当前作用域的变量 i,所以沿作用域链找到了全局作用域中的 i)
方法 2 中,由于 es6 的 let 会创建局部作用域,所以循环设置了五个作用域,而五个作用域中的变量 i 分布是 1-5,每个作用域中又设置了一个定时器,打印一秒后变量 i 的值。一秒后,定时器从各自父作用域中分别找到的变量 i 是 1-5 。这是个利用闭包解决循环中变量发生异常的新方法。
以上关于javascript闭包是什么 闭包的作用的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » javascript闭包是什么 闭包的作用
微信
支付宝