首先理解概念
闭包,其实是一种语言特性,它是指的是程序设计语言中,允许将函数看作对象,然后能像在对象中的操作般在函数中定义实例(局部)变量,而这些变量能在函数中保存到函数的实例对象销毁为止,其它代码块能通过某种方式获取这些实例(局部)变量的值并进行应用扩展
实例
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
add();
add();
变量 add 的赋值是自调用函数的返回值。
这个自调用函数只运行一次。它设置计数器为零(0),并返回函数表达式。
这样 add 成为了函数。最“精彩的”部分是它能够访问父作用域中的计数器。
这被称为 JavaScript 闭包。它使函数拥有“私有”变量成为可能。
计数器被这个匿名函数的作用域保护,并且只能使用 add 函数来修改。
闭包指的是有权访问父作用域的函数,即使在父函数关闭之后。
简要概括
“一个函数”
一个外部函数通过调用函数并return返回出内部函数,这里的内部函数就是一个闭包
此时在内部函数中是可以访问到外部函数的变量的;
为什么要使用闭包?
如果我们想达到函数外部能访问内部变量的时候,我们就可以使用闭包,获得便利条件
闭包的优缺点
优点:
1.可以读取函数内部的变量
2.可以避免全局污染
缺点:
1.闭包会导致变量不会被垃圾回收机制所清除,会大量消耗内存;
2.不恰当的使用闭包可能会造成内存泄漏的问题;
总结:
1.作用域链查找变量的方式是一层一层的往上查找,直到找到为止,如果找到window全局作用域还未找到,就报undefined;
2.嵌套函数中,因为不在同一作用域,正常情况下内外部函数是访问不到内部函数的,但是通过闭包可以实现;
3.尽可能少的使用闭包,因为会造成内存消耗大以及有可能造成内存泄露(如果不需要的时候,不要随便使用);
持续更新中......