闭包是什么
闭包是指有权访问另外一个函数作用域中的变量的函数 我们来看一个例子
var a = 0
function foo(){
var b =14
function fo(){
console.log(a, b)
}
fo()
}
foo()
这里的子函数 fo 内存就存在外部作用域的引用 a, b,所以这就会产生闭包
闭包变量存储的位置
闭包中的变量存储的位置是堆内存。
闭包的作用
- 保护函数的私有变量不受外部的干扰。形成不销毁的栈内存。
- 保存,把一些函数内的值保存下来。闭包可以实现方法和属性的私有化
function fn() {
let i = 0
function add() {
i++;
return i
}
return add
}
const f = fn()
console.log(f()) // 1
console.log(f()) // 2
栈:
var stack = (function() {
var arr = []
return {
push: function(val) {
arr.push(val)
},
pop: function() {
return arr.pop()
},
size: function(val) {
return arr.length
}
}
})()
stack.push('aaa')
stack.push('bbb')
stack.push('ccc')
stack.pop()
console.log(stack.size())
经典的定时器问题
for(var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i)
}, 1000 * i)
}
使用闭包
for(var i = 0; i < 5; i++) {
(function(j) {
setTimeout(() => {
console.log(j)
}, 1000 * i)
})(i)
}