首页 > 其他分享 >闭包使用场景

闭包使用场景

时间:2023-10-10 10:45:18浏览次数:44  
标签:闭包 function 场景 return button count 使用 console

闭包在JavaScript中有许多应用场景,它们可以帮助你解决各种问题,包括封装数据、创建模块、处理异步操作等。以下是一些常见的闭包应用场景:

  1. 封装私有变量和方法: 使用闭包可以创建对象,其中包含私有成员变量和方法,这些成员对外部代码不可见。这有助于实现信息隐藏和数据封装。

    function Counter() {
      let count = 0;
    
      return {
        increment: function() {
          count++;
        },
        decrement: function() {
          count--;
        },
        getCount: function() {
          return count;
        }
      };
    }
    
    const counter = Counter();
    counter.increment();
    console.log(counter.getCount()); // 输出: 1
    
  2. 模块模式: 闭包允许你创建具有私有状态和公共接口的模块。这可以用于将代码分成可维护的模块。

    const MyModule = (function() {
      let privateVar = 0;
    
      function privateFunction() {
        return privateVar;
      }
    
      return {
        increment: function() {
          privateVar++;
        },
        getPrivateVar: function() {
          return privateVar;
        }
      };
    })();
    
    MyModule.increment();
    console.log(MyModule.getPrivateVar()); // 输出: 1
    
  3. 事件处理程序: 闭包用于处理事件监听器,它可以捕获事件处理程序内部的状态。

    function createButton() {
      let count = 0;
      const button = document.createElement('button');
      button.textContent = 'Click me';
    
      button.addEventListener('click', function() {
        count++;
        console.log(`Button clicked ${count} times`);
      });
    
      return button;
    }
    
    const button = createButton();
    document.body.appendChild(button);
    
  4. 回调函数: 闭包用于创建回调函数,使其能够访问外部作用域的变量。

    function fetchData(url, callback) {
      // 模拟异步请求
      setTimeout(function() {
        const data = 'Some data fetched from ' + url;
        callback(data);
      }, 1000);
    }
    
    fetchData('https://example.com/api', function(response) {
      console.log(response);
    });
    
  5. 循环中的闭包: 在循环中使用闭包可以解决经典的循环问题,例如在计时器或事件监听器中访问循环变量。

    for (var i = 0; i < 5; i++) {
      setTimeout(function() {
        console.log(i); // 输出: 5 5 5 5 5
      }, 1000);
    }
    

    若要解决此问题,可以使用闭包来捕获循环变量的值:

    for (var i = 0; i < 5; i++) {
      (function(index) {
        setTimeout(function() {
          console.log(index); // 输出: 0 1 2 3 4
        }, 1000);
      })(i);
    }
    

标签:闭包,function,场景,return,button,count,使用,console
From: https://www.cnblogs.com/meilejushi/p/17754026.html

相关文章

  • oracle中to_char(), to_date() ,ROUND(),NVL(), DECODE(), EXTRACT()等函数的使用
    1.to_char()将时间日期按照指定的格式输出,得到的是字符串,而非date类型。只要被转换的是一个日期,yyyy,mm,dd中间加不加连接符,加什么连接符都可以2.todate()将字符串按照指定的格式输出,得到的是日期类型。第一个参数的yyyy,mm,dd之间有没有连接符。如果有,那么第二个参数必须有......
  • channel 通道错误的使用例子
    1.向已经关闭的通道发送值,引起panic错误packagemainimport"fmt"funcrecv(cchanint){ ret:=<-c fmt.Println("接收成功",ret)}funcmain(){ ch:=make(chanint) gorecv(ch)//启用goroutine从通道接收值 ch<-10 close(ch) ch<-9 fmt.Prin......
  • MultiDex介绍与使用
    MultiDexClass文件与Dex文件Dex(Dalvik-executable)class文件处理后的产物,专门为安卓上的虚拟机设计的一种压缩格式inJAVA:*.java*.kt=>*.class=>JVMinAndroid:*.java*.kt=>*.class=>(去冗余)*.dex=>DalvikVMorARTVM使用MultiDex的原由当Android应......
  • ftrace在应用上的使用
    之前介绍通过命令行配置和使用ftrace功能,但是实际中,我们也会希望抓C/C++程序中某段代码的调度情况。笔者前不久就遇到这种问题,某个函数调用时延概率超过100ms,是为什么?这时候就需要在他们代码中使能ftrace抓执行此函数时候,任务的调度情况。观察某段代码执行过程中的情况,ftrace提供......
  • 8种品牌PLC单片机使用Socket编程实现以太网开放式通信服务器视频教程
    8种品牌PLC单片机使用Socket编程实现以太网开放式通信服务器视频教程一、罗克韦尔ABMicro850系列PLC实现ModbusTCP以太网通信协议​服务器视频教程:罗克韦尔ABMicro850系列PLC做ModbusTCP以太网通信服务器、以太网调试助手和ModbusPoll调试助手做ModbusTCP以太网通信客户端,......
  • C# DataTable使用方法详解
    在项目中常常常使用到DataTable,假设DataTable使用得当,不仅能使程序简洁有用,并且可以提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结。1、添加引用1using System.Data;2、创建表1234//创建一个空表DataTabledt=n......
  • python接口自动化之request请求,如何使用 Python调用 API?
    Python实战|如何使用Python调用API一、HTTP 请求HTTP 请求是在 HTTP 协议下的一种数据格式,用于向服务器发送请求,其通常由请求行、请求头和请求体三部分构成,请求头和请求体之间用空行隔开,其中各部分包含的信息如下:请求行 (Request Line):包括请求方法 (GET请求、POST请......
  • 01 | vim的一些使用说明
    我们在使用vim编写C或者C++的代码的时候,没有自动提示很影响编辑体验。那么我建议安装YCM插件,本文是基于安装完毕该插件的情况下,依然没有头文件自动提示的情况进行说明。YCM插件有三个头文件提示来源。vim自带的ctags机制vim打开的文件夹内的compile_commands.j......
  • C# Winform ComboBox使用笔记
    ComboBox添加元素//添加元素到ComboBoxcomboBox1.Items.Add("元素1");comboBox1.Items.Add("元素2");comboBox1.Items.Add("元素3");for(inti=4;i<6;i++){comboBox1.Items.Add($"元素{i}");}//设置默认显示的项comboBox1.Selecte......
  • 使用C#在Windows上压缩文件
    使用C#通过Zip实现文件的压缩可以设置输出文件的路径也可以留空,留空则会在压缩文件创建一个同名的.压缩包可以设置压缩包的密码可以设置压缩包的加密方式(ASE-256),可以使用LZMA但是加密码会报错可以设置压缩包的格式(zip),可以使用7z但是加密码会报错添加了密码最大长度的限......