初探闭包

| 分类 jsstudylog  | 标签 jsStudyLog 

什么是闭包

概念定义说法非常多,先写一个纯正闭包

function a(){
    var i=0;
    function b(){
        alert(++i);
    }
    return b;
}
var c = a();
c();

这个函数有几个特点:
1、函数b嵌套在函数a中;
2、函数a返回函数b
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
函数的执行过程:
1、在var c = a();执行了a函数,那么肯定a经过了return,按照主流语言的函数特性,现在c的值就是a的返回值。
2、在c();的执行实际执行的就是b函数,最后不管执行的是谁,会弹出一个值为1的窗口,到此为止,所有的生命周期按理论来说就算全部结束了,可是,如果我们再多执行一行var c = a();c();c();,第一次弹出1,第二次执行却弹出了2
3、也就是说,第一次c();后,a中的i依然保留,自然a在内存的栈区依然保留。areturn过了,但是,a及内部值却依然存在,这就是闭包。

闭包特性

  1. 闭包外层是个函数
  2. 闭包内部存在函数
  3. 闭包会返回内部函数
  4. 闭包返回的函数的内部不能有返回值(因为这样就真的结束了)
  5. 执行闭包后,闭包内部变量会存在,而闭包内部函数的内部变量不会存在

    闭包作用

    闭包的作用就是在a执行完并返回后,闭包使得JavaScript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。(这个还是需要进一步再了解,感觉还不够严谨,之后的学习会继续更新)


上一篇     下一篇