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也一直存在于内存中。
所以闭包也会引起内存泄漏。要手动清除闭包所引用的变量。