简明扼要地认识Js闭包

普通的函数

function outer() {
  console.log('outer')
}

outer() // outer

返回函数的函数

function outer() {
  console.log('outer')
  function inner() {
    console.log('inner')
  }
  return inner
}

const fun = outer() // outer (此处执行console.log('outer'),并将inner赋给fun)

fun() // inner (此处执行console.log('inner'))

闭包

内层函数不是独立时,触发闭包,例如内层函数需要访问上层变量。

function outer() {
  console.log('outer')
  const outerStr = 'Hello'
  function inner() {
    console.log(outerStr + 'inner')
  }
  return inner
}

const fun = outer() // outer

fun() // Helloinner

产生原因:JS runtime 会实时跟踪变量,当其没有被引用时即被回收。一般情况下,函数内部的变量,在函数执行完后便不再被引用,runtime 会销毁变量,释放内存。

而返回的函数引用外层的变量,即这个变量在外层函数执行完毕后仍然被应用,所以 runtime 不会销毁它,让它继续存在。

这就是闭包(Closure)。

简单应用

当你需要将一个函数内变量一直放在内存里,即使该函数执行完毕也存在时,就需要使用到闭包。
估计执行时间:

function getRunTime() {
  const begin = Date.now()
  function elapse() {
    console.log(Date.now() - begin)
  }
  return elapse
}
const timer = getRunTime() // 将当前时间戳赋给begin,将elapse赋给timer,elapse中的begin始终引用内存的变量。

for (let i = 0; i < 9999999; ++i) {
  1 + 1
}

timer() // 13 得出大致的for(){}执行的时间

自增自减:

function add() {
  let begin = 0
  return function() {
    console.log(++begin)
  }
}
const adder = add()

adder() // 1
adder() // 2

结束,解释得还可以吧 : )

    原文作者:VoyagerOne
    原文地址: https://www.jianshu.com/p/0c264b4d3c09
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞