闭包函数

概念

闭包函数:声明在一个函数中的函数,叫做闭包函数。

闭包:内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。

 

优缺点

让外部访问函数内部变量成为可能;

局部变量会常驻在内存中;

可以避免使用全局变量,防止全局变量污染;

会造成内存泄漏(有一块内存空间被长期占用,而不被释放)

 

代码示例

复制代码
 1       function outer() {
 2           //私有空间
 3           function inner() {
 4               console.log("内部函数")
 5           }
 6          return inner;
 7       }
 8      const closure=outer();
 9      closure();
10     //  const closure=function(){
11     //      console.log("内部函数")
12     //  }
13 
14 
15 
16 
17   // ES6
18   const outer=()=>{
19     return ()=>{
20       console.log("内部函数")
21     }
22   }
23   const closure=outer();
24   closure();
复制代码

 

 

案例(计时器)

像我们如下写一个计时器

复制代码
  // // 计数器

  const add=()=>{
    let counter=0;
    counter++;
    return counter;
  }
  // 调用三次 add()
  console.log(add());
  console.log(add());
  console.log(add());
复制代码

会发现三次执行效果都是1,这是因为每一次调用都会销毁原函数,所以需要使用闭包来达到计时效果,调用闭包函数是不会销毁闭包函数的,会一直保存,也就造成了内存占用

复制代码
  const add = () => {
    let counter = 0;
    //闭包
    return () => {
      counter++;
      return counter;
    }
  }
  // 调用三次 add()
  const closure=add();
  console.log(closure());
  console.log(closure());
  console.log(closure());
复制代码

如此,便能实现计时效果。

案例(验证码)

像我们登录设备的时候获取验证码,倒计时可以使用闭包函数来实现,如

复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <p id="demo"></p>
</body>

</html>
<script>

  const add = () => {
    let counter = 10;
    //闭包
    return () => {
      counter--;
      return counter;
    }
  }
  const closure = add()
  let timer = setInterval(() => {
    let h1 = document.getElementById('demo')
    h1.textContent = closure();
    if (h1.textContent == 0) {
      clearInterval(timer)
      h1.textContent = "重新获取验证码";
    }
  }, 1000)

</script>
复制代码

达到一种倒计时效果。

 

 

 

posted @   AKpz  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示