closure!

总结一下闭包。javascript

闭包的定义:当一个内部函数被其外部函数以外的变量所引用时,就造成了一个闭包。java

一个最简单的闭包:闭包

function A(){
    var count=0;
    return function(){
        count++;
        console.log(count);
    };
}
var B=A();
B();    //1 
B();    //2
B();    //3

important!=>javascript的GC机制:函数

  在javascript中,若是一个对象再也不被引用,那么这个对象就会被GC回收,不然这个对象一直会保存在内存中。spa

因此咱们就能够理解为何在上述代码中,A函数明明已经被返回退出执行了,变量count却没有被回收(count一直在原来的基础上增长1,而不是每一次都从新从0开始再增长1),由于匿名函数(闭包)被返回赋予变量B,即被变量B所引用(在javascript中对象的赋值是引用传递),故这个匿名函数不会GC回收,同时变量count被匿名函数所引用,因此变量count亦不会被回收,所以变量count才会一直会保存于内存中。code

闭包的特性对象

js分全局做用域和函数做用域(没有块级做用域,if语句或for循环语句里面定义的变量在外部能够被访问)。函数做用域里能够访问到全局,经过一个叫做用域链(函数内部做用域=>父级函数的做用域=>父级函数的父级函数的做用域...=>全局做用域)的东西。
但全局怎么访问函数呢?咱们能够经过在函数里面返回一个函数(闭包),就能够在全局访问到函数里的数据了(在上面代码中,咱们在全局里访问到了A函数的count变量)。
不过闭包能访问到父级函数里面的数听说明父级函数里的数据一直存在内存中(一直被闭包所引用着),而没有被GC所回收,这就会致使内存一直被占着。
相关文章
相关标签/搜索