Day1-闭包

79 阅读2分钟

Day1 打卡

每日一句

If I was going somewhere, I was running.

释义:如果我要去哪里,我就跑着去。

闭包概念 - closure

【mdn】: 内层函数访问到其外层函数的作用域,在javascript中,函数一创建,闭包就同时被创建。
【红宝书】:闭包是指有权访问另外一个函数作用域中的变量的函数。
【JS忍者秘籍】: 闭包允许函数访问并操作函数外部的变量。

浅显的用法上去理解: 既能复用变量又能保护变量不被污染的一种编程方法

如果希望给一个函数保存一个即可复用又不会被外界污染的专属局部变量时,就可以使用闭包。

如何理解闭包

  • 脑补词法环境,词法作用域
  • 形成闭包的原因

内部的函数存在外部作用域的引用就会形成闭包

如何使用闭包,三步走

  1. 用外层函数包裹要保护的变量和使用变量的内层函数
  2. 在外层函数内部返回内层函数(内层函数起不起名结果一样)
  3. 调用外层函数

为什么三步就可以实现闭包?

一句话概括:外层函数调用后,外层函数的作用域对象被返回的内层函数作用域链引用着,无法释放,就形成了闭包对象。

示列

例1:一个内层函数

function mother() {
    let total = 1000;
    return function(money) {
        total -= money;
        console.log(total);
    }
}
const pay = mother();
pay(100); // 900
pay(100); // 800

例2: 多个内层函数

function mother() {
 let total = 100;
 getV = function() {
   total++;
 }
 return function() {
     console.log(total);
 }
}
var getN = mother();
getN(); //100
getV(); //101
getN(); //101

例3:

function monther() {
  var i=0;
  return function() {
      i++;
      console.log(i)
  }
}

var get1 = monther();
get1(); // 1
var get2 = monther();
get2(); // 1
get1(); // 2
get2(); // 2

例4: 数组返回内层函数

function mother() {
 arr = [];
 for(var i=0; i<3; i++) {
    arr[i] = function() {
      console.log(i)
    }
 }
}
mother();
arr[0](); // 3
arr[1](); // 3
arr[2](); // 3

总结

闭包存在三个元素:

  • 外层函数
  • 外层函数的局部变量
  • 内层函数(多个)

外层函数返回内层函数的方法有3种场景

  • return
  • 强行赋值全局变量
  • 将函数包裹在数组或对象中返回

闭包缺点:容易造成内存泄漏 解决方案是及时释放不用的闭包,只要把内层函数的变量置为null,闭包就没有了