js闭包

1、什么是闭包

闭包与作用域有关,变量的作用域有两种:全局和局部。函数体内的变量如果用var声明和定义的都是局部变量,那么当出了函数体,在外部就访问不到该变量。

使用某种方式,使得在函数体内的变量依然可以在外部被访问到,这个就叫做闭包。通俗的理解,闭包就是在函数体外依然可以访问到函数体内的变量。

2、为什么可以访问到函数体内的变量

首先需要了解js的垃圾回收机制。垃圾回收有两种,标记清除和引用计数。

function aa(){
    var b=1;
    return function(){
    b++;
    console.info(b);
    }
}

var f = aa();
f();//2
f();//3
f();//4

上面的代码就形成了闭包。在aa的函数外依然可以访问b。

为什么能访问b呢,因为aa返回了子函数将它赋值给了f,而这个子函数是可以访问到aa中的任意变量的。由于在函数aa外部依然有变量f在引用,所以当aa执行完成后作用域无法被销毁,所以变量b也一直存在于内存中。

所以闭包也会引起内存泄漏。要手动清除闭包所引用的变量。

 

posted @ 2018-10-12 10:47  abc1234_abc  阅读(281)  评论(0编辑  收藏  举报