什么是闭包
两种理解:
理解一:闭包是嵌套的内部函数
理解二:包含被引用变量的对象
产生闭包的条件
一、函数被嵌套在一个函数里
二、内部函数引用了外部函数的数据(变量/函数)
关键点
执行函数定义就会产生闭包(不需要调用内部函数)
外部函数被调用几次就会产生几个闭包
常见的闭包
1、将函数作为另一个函数的返回值
2、将函数作为实参传递给另一个函数调用
闭包的作用
1、使用函数内部的变量在函数执行完后,仍然存活在内存中(演唱了局部变量的生命周期)
2、在外部作用域中可以操作到函数内部的数据(变量/函数)
闭包的生命周期
产生:在嵌套在内部函数定义执行完时产生(不是在调用的时候产生)
死亡:在嵌套的内部函数称为垃圾对象时
闭包的缺点
函数执行完后,函数内的局部变量没有释放,占用内存时间变长,容易造成内存泄漏
<script>
function func () {
var a = 0
return function i () {
a ++
console.log(a)
}
}
var fun = func()
fun()//1
fun()//2
</script>
闭包面试题
<script>
function fun(n,o){
console.log(o);
return {
fun:function(m){
return fun(m,n)
}
}
}
var a = fun(0)//?
var b = fun(0).fun(1).fun(2)//?
var c = fun(0).fun(1)//?
c.fun(2)//?
c.fun(3)//?
</script>
答案
var a = fun(0)//undefined
var b = fun(0).fun(1).fun(2)//undefined 0 1
var c = fun(0).fun(1)//undefined 0
c.fun(2)//1
c.fun(3)//1