1、什么是闭包

  1. 闭包就是有权访问另一个函数作用域中的变量的函数

2、闭包形成的原因

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

3、闭包有哪些作用

3-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. console.log(cat);//返回的是一个对象
  14. cat.setName('黑猫')
  15. console.log(cat.getName());

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

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

  1. for (var i = 0; i < 5; i++) {
  2. setTimeout(() => {
  3. console.log(i);
  4. }, i * 100);
  5. }
  6. //结果打印了5个5
  7. for (var i = 0; i < 5; i++) {
  8. (function (j) {
  9. setTimeout(() => {
  10. console.log(j);
  11. }, j * 100);
  12. })(i);
  13. }
  14. /*
  15. * 上面的代码,循环了10次,创建了10个函数,每个函数传入的值都不一样
  16. * setTimeout里面的函数是个闭包,它的外层函数的变量j,因为闭包缘故,没有被销毁,打印的时候可以取到它的值
  17. */

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