前言
闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。第一次接触闭包这个概念肯定不好理解,这篇文章来简单介绍理解一下什么是闭包。
什么是闭包
什么是闭包,通过我的理解就是由于js的机制,外部函数无法使用内部函数的变量,但是内部函数可以使用外部函数的变量,当这样一个使用了外部函数的变量的内部函数在包含他的外部函数之外被调用了,那么就形成了闭包。
可以看出要形成闭包至少要这几个条件:
- 至少两个函数,一个外部部函数,一个嵌套在外部函数里面的内部函数
- 内部函数中使用了外部函数中的变量
- 在外部函数以外的地方调用了内部函数
一个简单的闭包函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17function a() {
//外部函数中有一个变量
count = 1;
//将内部函数返回出去
return function () {
//内部函数中使用了外部函数中的变量
count++;
console.log(count);
}
};
//此时b指向的就是内部函数
var b = a();
//在全局中调用了b所指向的内部函数,所以变量 count 就会一直保存在全局AO中
b(); //2
//当再次调用的时候就会继续使用全局中没有被回收的变量 count
b(); //3
b(); //4
闭包的用途
可以通过上面的一个简单的闭包函数可以看到,当执行完函数之后,count
的值并没有被释放,可以长久的保存并且不会污染全局变量。
闭包的高级用法
闭包通常可以配合匿名函数使用:
配合匿名立即执行函数使用就可以很轻松的将一个函数转化为闭包。
1 | var b; |
将最开始的例子改写以下,这样也是一个闭包,虽然没有返回值,但是最终还是通过对象来调用了内部的函数从而使用了外部函数的变量,实际上还是一个闭包。
还有一个闭包的例子参考我的另一篇博客关于for循环中使用setTimeout
如何创建一个闭包
- 定义外层函数,封装被保护的局部变量。
- 定义内层函数,执行对外部函数变量的操作。
- 外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。(实际上不一定要返回内部函数,返回内部函数只是使内部函数在全局中被使用的一种方式)
总结
通过这次的学习对闭包有了一定的了解,由于闭包不会释放外部函数变量,所以会一直消耗内存,所以闭包的使用有利有弊,合理的使用对开发有帮助的,需要在项目中多多使用,渐渐深入理解。