js的作用域分两种,全局和局部,基于我们所熟悉的作用域链相关知识,我们知道在js作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的变量并且可以获得当前包含当前作用域的外层作用域下的变量,反之则不能,也就是说在外层作用域下无法获取内层作用域下的变量,同样在不同的函数作用域中也是不能相互访问彼此变量的,那么我们想在一个函数内部也有限权访问另一个函数内部的变量该怎么办呢?闭包就是用来解决这一需求的,闭包的本质就是在一个函数内部创建另一个函数。
函数里面包含的子函数,子函数访问父函数的局部变量
通过return将子函数暴露在全局作用域,子函数就形成闭包
通过闭包,父函数的局部变量没有被销毁,可通过闭包去调用 ,但同时,这个局部变量也不会被全局变量污染
function outFn() {
var count = 0;
function innerFn(){
return count += 1;
}
return innerFn;
}
var add = outFn();
add(); // 1
避免全局变量的污染,同时,局部变量没有被销毁,驻留在内存中,还可以被访问
但
增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;