闭包的形成与应用

1,008 阅读3分钟

闭包的产生与应用

闭包的产生

  • 1. Javascript的运行在运行过程中有变量具有局部作用域和全局作用域的区分
  • 2. 局部作用域内可以访问全局作用域的变量 反之不可
  • 3. 当局部作用域变量被保存到外部 能够被访问到则闭包形成

闭包的形成和Javascript的作用域以及作用域链(Chain scope)密不可分,闭包的形成其实就是作用域链没有被释放,因此会造成内存泄露.

闭包的构成

从名字上来看闭包肯定是闭合包裹的一个东西,其实就是用一个函数来包裹需要return给外部的内容(可以是变量、函数等任何你想保存的东西),利用的就是函数的作用域和作用域链.

一个闭包的例子

 1function test({
2    var num = 0;
3    function foo({
4        console.log(++num);
5    }
6    return foo;
7}
8var fn = test();
9fn();
10fn();
11fn();

解析:test函数有内部变量num和函数foo,当test函数运行时会return foo函数,foo函数可以访问到外部变量num(指向的是test函数的作用域),test函数执行后并没有被销毁,因为foo函数对其变量还有引用,在foo的作用域链上存在三个值:

  • 一: foo函数自身的作用域 其没有任何变量
  • 二: foo引用test还是的作用域test(chain scope)有一个变量num和foo函数
  • 三: 全局作用域 
    直到闭包引用消失后test的函数作用域才会被销毁 释放内存

闭包的作用

  • 1. 外部函数需要访问外部变量
  • 2. 函数私有项(变量私有化)
    第一种上面的例子已经实现了 下面看看函数变量私有化

利用闭包实现函数变量私有化

一个函数具有其内部私有项,外部无法访问除非函数提供相应的方法

 1function leifeng(somthing{
2    var obj = {
3        name'leifeng',
4        somthing: somthing,
5        writeDiaryfunction({
6            console.log(`我是${this.name},今天做了一件好事情,具体为:${this.somthing}`);
7        },
8        askfunction({
9            console.log(this.somthing)
10        }
11    }
12    return +function({
13        obj.writeDiary()
14    }()
15}
16leifeng('帮老奶奶过马路'); // 我是leifeng,今天做了一件好事情,具体为:帮老奶奶过马路

注解:

  • 1. 函数leifeng拥有私有变量obj,obj中保存了一些变量和方法
  • 2. 如果leifeng不提供writeDiary函数那么你永远不知道他都做了什么东西,obj就是他的私有变量
  • 3. 只有leifeng对外提供一个方法(写日记)大家才知道他每天都做了什么事情
我的公众号: