普通的函数
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
结束,解释得还可以吧 : )