闭包的产生
当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包
闭包的理解
一.闭包是嵌套的内部函数
二.是包含被引用变量的对象
注意:闭包存在于嵌套的内部函数中
产生闭包的条件
函数嵌套
内部函数调用了外部函数的数据(变量/函数)
1 2 3 4 5 6 7 8 9
| function fn1(){ var a=2 var b='abc' function fn2(){ //执行内部函数定义时就会产生闭包(不用调用内部函数) console.log(a) } fn2() } fn1()
|
常见的闭包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| //将函数作为另一个函数的返回值返回
function fn1(){ //将当前执行的上下文进行压栈,执行完后就出栈了, var a=2 //也就是fn1执行完就出栈了,但是返回的值fn2包含这fn1的闭包 function fn2(){ //所以第二次调用f()时,结果是4 a++ //因为上一次调用后的a因为闭包的存在,并没有被释放 console.log(a) // } return fn2 } var f=fn1() f() //3 f() //4 //第一次执行到第4行是因为11行调用了fn1,此时已经产生了一次闭包,因为存在函数提升 //执行12行13行时都会直接跳到第5行,执行内部的函数, //此时并没有再执行外部函数,所以并没有再产生多余的闭包 //第4行的变量a是局部变量,但因为产生了闭包所以并没有在函数调用完后释放
|
注意:外部函数执行的时候才会创建内部函数,外部函数执行几次就会创建几次内部函数,也就是创建几次闭包
1 2 3 4 5 6 7
| //将函数作为实参传递给另一个函数调用 function showDelay(msg,time){ setTimeout(function(){ alert(msg) },time) //此时闭包中只有meg,这是对meg的引用 } showDelay('bibao',2000)
|
闭包的作用
1.使用函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)
2.让函数外部可以操作(读写)到函数内部的数据(变量/函数)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function fn1(){ var a=2 function fn2(){ a++ console.log(a) } function fn3(){ a-- console.log(a) } return fn3 } var f=fn1() //此处是对fn3的引用,所以fn3这个内部对象不是垃圾对象 f() //1 f() //0 //fn1执行完后,a还在,fn2,fn3都被释放,因为此时闭包里只有a //
|