(一) 闭包是什么, 闭包形成的原因

闭包的概念:闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包最常用的方式就是在一个函数内部创建另一个函数(函数中的函数)。
简单概括: 闭包就是一个能访问另外一个函数内部变量的函数

闭包形成的原因:函数内部的局部变量一般在函数运行结束的时候就会被销毁, 但如果局部变量因为被外部引用而导致没有被销毁, 就形成了闭包

(二) 闭包有哪些作用

1.封装私有变量(私有属性)

  1. function getCat() {
  2. var name = '白猫';
  3. return {
  4. getName: function() {
  5. return name;
  6. },
  7. setName: function(newName) {
  8. name = newName;
  9. }
  10. }
  11. }
  12. var cat = getCat();
  13. cat.getName(); // 白猫
  14. cat.setName('黑猫');
  15. cat.getName(); // 黑猫

私有变量(私有属性)是后台语言经常用的东西,意思是这个属性是私有的,不能随意更改,要改,必须通过指定的set和get方法进行获取和修改

2.模仿块级作用域(ES5中没有块级作用域)

  1. // 函数自调用
  2. var num = 100;
  3. (function(aa) {
  4. console.log(aa);
  5. })(num);
  6. // 根据以下代码,说出打印结果
  7. for (var i = 0; i < 10; i++) {
  8. setTimeout(() => {
  9. console.log(i);
  10. }, i * 100);
  11. }
  12. // 结果是打印了10个10,并不是我们希望0-9,要想实现我们期待的结果可以使用闭包实现
  13. for (var i = 0; i < 10; i++) {
  14. (function(j) {
  15. setTimeout(() => {
  16. console.log(j);
  17. }, j * 100);
  18. })(i);
  19. }
  20. /**
  21. * 上面的代码,循环了10次,创建了10个函数,每个函数传入的值都不一样
  22. * setTimeout里面的函数是个闭包,它的外层函数的变量j,因为闭包缘故,没有被销毁,打印的时候可以取到它的值
  23. */

3.实现JS的模块

  1. function CoolModule() {
  2. var something = "cool";
  3. var another = [1, 2, 3];
  4. function doSomething() {
  5. alert( something );
  6. }
  7. function doAnother() {
  8. alert( another.join( " ! " ) );
  9. }
  10. return {
  11. doSomething: doSomething,
  12. doAnother: doAnother
  13. };
  14. }
  15. var foo = CoolModule();
  16. foo.doSomething(); // cool
  17. foo.doAnother(); // 1 ! 2 ! 3

使用闭包的注意点

  1. 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题