【JS高级】 闭包(closure)

182 阅读1分钟

闭包是什么

闭包是指有权访问另外一个函数作用域中的变量的函数 我们来看一个例子

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)
}