十八、闭包

闭包就是能够读取其他函数内部变量的函数

一、闭包简介

闭包的作用:可以读取函数内部的变量

函数的封装

  • 在内存中,定义一个存储空间,赋值一个内存地址,准备存储函数

  • 将函数以类似字符串的形式存储在存储空间中

  • 将存储空间的内存地址,赋值给变量或者函数名称存储

 1 function fun2() {
 2   const obj = {
 3     name: '张三',
 4     age: 18,
 5   }
 6   // return 返回的实际是,obj变量中存储的对象的内存地址
 7   return obj;
 8 }
 9 // 变量o中存储的是obj对象的内存地址
10 const o = fun2();
  • 执行空间不被销毁的条件

    • 函数的返回值是一个引用数据类型

    • 在函数外有另一个变量存储返回值

  • 闭包的语法

    • 有一个函数A,返回值是一个函数B

    • 在函数A之外,有一个变量,存储返回值函数B

    • 在函数B中调用函数A中希望在函数外被使用的变量

 1 function funA(){
 2   var int = 100;
 3 
 4   return function funB(){
 5     // return的是int中存储的数值,不是int这个变量
 6     return int;
 7   }
 8 }
 9 const a = funA();
10 console.log( a ); // funB
11 // 此时,这个变量int,还无法在函数外被调用
12 console.log( int )
13 // 调用a执行
14 console.log( a() ); // 100

二、闭包的特点

  • 函数的执行空间不会被销毁

    • 优点:空间中的内容,会一直存在

    • 缺点:会占用内存空间,降低执行效率

  • 可以从函数外部调用函数内部的数据

    • 优点:数据使用便捷

    • 缺点:容易造成数据泄露,不安全

  • 保护局部作用域变量不被销毁

    • 优点:局部作用域变量不被销毁

    • 缺点:占用存储空间,容易内存泄露

内存泄漏:是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果

  • 全局变量污染:

    • 如果一个全局作用域变量,被不应该操作的函数,修改了存储的数据,就称为全局变量濡染

    • 全局作用域变量特点:任意一个函数都可以调用修改这个变量存储的数据数值

    • 闭包看似是一个为了调用函数内,局部作用域变量的方法

    • 实际上,是为了防止全局变量污染的一个手段

    • 为了防止全局变量污染,可以使用一个函数,将变量定义为局部作用域变量

    • 其他函数的操作,就不会影响到这个变量存储的数据了

    • 使用闭包让局部作用域变量可以在函数外部被调用、被使用

 

posted @ 2021-07-18 14:32  大米饭盖饭  阅读(56)  评论(0)    收藏  举报