简易版“闭包”,一看就能学会

1、为何会产生闭包?

在开始说闭包以前,咱们要先理解一下变量的做用域,变量的做用域无非有两种:全局做用域和局部做用域。闭包

出于种种缘由,有时候咱们须要获得函数内部的局部变量。函数

可是,在正常状况下这个是办不到的,只有经过变通的方法才能实现。性能

这个方法就是,在函数的内部再定义一个函数。code

function f1() {  
    let a = 1  
  function f2() {  
        console.log(a);  
  }  
}

在上面的代码中,函数 f2 就被定义在了 函数 f1 中,这时 f1 内的全部局部变量对 f2 都是可见的。对象

可是反过来就不行,f2 内部的局部变量对 f1 就是不可见的。内存

那么既然 f2 能够读取 f1 中的变量,那么只要把 f2 做为返回值,咱们不就能够在 f1 外部读取它内部的变量了吗!作用域

function f1() {  
    let a = 1  
  function f2() {  
        console.log(a);  
  }  
    return f2;  
}  
  
var result = f1();  
  
result()

2、闭包是什么?

定义:若是一个函数用到了外部的变量,那么这个函数加这个变量,就叫作闭包。开发

好比,这里就是一个闭包:产品

function f1() {  
    let a = 1  
  function f2() {  
        console.log(a);  
  }  
}
// 函数 f2 能够访问外部的变量 a,那么函数 f2 和 外部的变量 a 就构成了闭包

3、闭包的做用是什么

闭包经常用来间接访问一个变量,换句话说,就是隐藏一个变量。io

假如咱们在开发一个商城项目,里面有产品数量的代码。若是不使用闭包,那么你能够直接使用一个全局变量:

window.number = 200

这样子写存在一个问题,万一不当心把这个值改为了 0 该怎么办,因此咱们不能让人直接访问这个变量。

使用局部变量?使用局部变量别人又没法进行访问。

能够暴露一个访问器(函数),让别人能够“间接访问“。

代码能够这样子写:

!function () {  
    var number = 200  
  window.addGoods = function () {  
        number += 1  
  }  
    window.deleteGoods = function () {  
        number -= 1  
  }  
}()  
  
window.addGoods()

这个时候,你就能够调用 window.addGoods 来添加商品,调用 deleteGoods 来下架商品。

这其中一共有两个闭包:

  • number 和 addGoods 组成了一个闭包
  • number 和 deleteGoods 组成了一个闭包

4、闭包的缺点是什么?

因为闭包会使得函数中的变量都被保存在内存中,内存消耗很大,因此不能滥用闭包,不然会形成网页性能问题。

解决方法是,在退出函数以前,将不适用的局部变量所有删除。

5、使用闭包的注意点

闭包会在父函数外部改变父函数内部的值。

因此,若是你把父函数当作对象使用,把闭包当作他的公用方法,把内部变量当作它的私有属性,这时必定要当心,不要随便改变父函数内部变量的值。

相关文章
相关标签/搜索