闭包使用场景

闭包使用场景场景一 采用函数引用方式的 setTimeout 调用 和 click 一样 闭包的一个通常的用法是为一个在某一函数执行前先执行的函数提供参数 例如 在 web 环境中 一个函数作为 setTimeout 函数调用的第一个参数 是一种很常见的应用 setTimeout 将要执行的函数 或者一段 javascript 代码 但这不是我们要讨论的情况 作为它的第一个参数 下一个参数是需要延迟执行的时间 如果一段代码想通过 setTimeout 来调用 那么它需要传递一个函数对象的引用来作为第一个参数 延迟的毫秒数作为第二个参数 但这

场景一:采用函数引用方式的setTimeout调用(和click一样)
闭包的一个通常的用法是为一个在某一函数执行前先执行的函数提供参数。例如,在web环境中,一个函数作为setTimeout函数调用的第一个参数,是一种很常见的应用。setTimeout将要执行的函数(或者一段javascript代码,但这不是我们要讨论的情况)作为它的第一个参数,下一个参数是需要延迟执行的时间。如果一段代码想通过setTimeout来调用,那么它需要传递一个函数对象的引用来作为第一个参数。延迟的毫秒数作为第二个参数,但这个函数对象的引用无法为将要被延迟执行的对象提供参数。
但是,可以调用另一个函数来返回一个内部函数的调用,将那个内部函数对象的引用传递给setTimeout函数。内部函数执行时需要的参数,在调用外部函数时传递给它。setTimeout在执行内部函数时无需传递参数,因为内部函数仍然能够访问外部函数调用时提供的参数
原生的setTimeout传递的第一个函数不能带参数,通过闭包可以实现传参效果。






function f1(a) { 
    function f2() { 
    console.log(a); } return f2; } var fun = f1(1); setTimeout(fun,1000);//一秒之后打印出1 

场景二:回调
回调 定义行为,然后把它关联到某个用户事件上(点击或者按键)。代码通常会作为一个回调(事件触发时调用的函数)绑定到事件。
比如下面这段代码:




<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> <a href="#" id="size-12">12</a> <a href="#" id="size-20">20</a> <a href="#" id="size-30">30</a> <script type="text/javascript"> function changeSize(size){ 
    return function(){ 
    document.body.style.fontSize = size + 'px'; }; } var size12 = changeSize(12); var size14 = changeSize(20); var size16 = changeSize(30); document.getElementById('size-12').onclick = size12; document.getElementById('size-20').onclick = size14; document.getElementById('size-30').onclick = size16; </script> </body> </html> 

当点击数字时,字体也会变成相应的大小。

场景三:函数防抖
在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。实现的关键就在于setTimeOut这个函数,由于还需要一个变量来保存计3时,考虑维护全局纯净,可以借助闭包来实现。
如下代码所示:




/* * fn [function] 需要防抖的函数 * delay [number] 毫秒,防抖期限值 */ function debounce(fn,delay){ 
    let timer = null //借助闭包 return function() { 
    if(timer){ 
    clearTimeout(timer) //进入该分支语句,说明当前正在一个计时过程中,并且又触发了相同事件。所以要取消当前的计时,重新开始计时 timer = setTimeOut(fn,delay) }else{ 
    timer = setTimeOut(fn,delay) // 进入该分支说明当前并没有在计时,那么就开始一个计时 } } } 

场景四.封装私有变量  
如下面代码:用js创建一个计数器  
方法1:




function f1() { 
    var sum = 0; var obj = { 
    inc:function () { 
    sum++; return sum; }}; return obj; } let result=f1(); console.log(result.inc()); //1console.log(result.inc());//2console.log(result.inc());//3 
function f1() { 
    var sum = 0; function f2() { 
    sum++; return f2; } f2.valueOf = function () { 
    return sum; }; f2.toString = function () { 
    return sum+''; }; return f2; } //执行函数f1,返回的是函数f2 console.log(+f1());//0 console.log(+f1()())//1 console.log(+f1()()())//2 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201384.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午9:30
下一篇 2026年3月20日 上午9:30


相关推荐

  • php清除浏览器缓存代码,js清除浏览器缓存

    php清除浏览器缓存代码,js清除浏览器缓存本篇文章的内容是js清除浏览器缓存,在这里分享给大家,也可以给有需要的朋友做一下参考,大家一起来看一看吧一、meta方式一开始百度后的做法,但是在360中并不适应二、动态引入js+时间戳去除静态html的缓存–动态引入js文件动态引入js文件以及在js文件后边添加动态参数代码window.onload=function(){varscript=document.createElement(“s…

    2022年7月18日
    11
  • PHP导入excel数据到MYSQL

    这里介绍一个直接将excel文件导入mysql的例子。我花了一晚上的时间测试,无论导入简繁体都不会出现乱码,非常好用。PHP-ExcelReader,下载地址:http://sourceforge.

    2021年12月24日
    63
  • 决策树CART算法、基尼系数的计算方法和含义[通俗易懂]

    决策树CART算法、基尼系数的计算方法和含义[通俗易懂]决策树CART算法——基尼系数决策树的CART算法使用基尼系数来选择划分属性。一个数据集的纯度可以用基尼系数来度量Gini(D)=∑k=1∣y∣∑k′≠kpkpk′=1−∑k=1∣y∣pk2\begin{aligned}Gini(D)=\sum_{k=1}^{|y|}\sum_{k&#x27;\nek}p_kp_{k&#x27;}=1-\sum_{k=1}^{|y|}…

    2022年10月13日
    8
  • MyEclipse Blue Edition版安装【图文】

    MyEclipse Blue Edition版安装【图文】

    2021年8月30日
    63
  • Linux系统下使用gfortran

    Linux系统下使用gfortranLinux 系统下使用 gfortran 之前习惯了在 win 下用 fortran 写一些简单的专业课作业 切换到 linux 一脸懵逼 在此一一记录下踩过的坑 Linux 基本命令不完全总结第一次接触 linux 甚至如何关机都要问度娘 我实在是太菜了 我先把我迄今为止用到的命令做一个小结作为第一部分 gfortran 的用法在第二部分 超基础命令 shutdown hnow 立即关机 定时关机就把 now 改成时间 例如 10 53 10min reboot 重启 ls dir 查看文件夹下的全部文件

    2026年3月26日
    2
  • 使用自己的数据集训练GoogLenet InceptionNet V1 V2 V3模型(TensorFlow)「建议收藏」

    使用自己的数据集训练GoogLenet InceptionNet V1 V2 V3模型(TensorFlow)「建议收藏」使用自己的数据集训练GoogLenetInceptionNetV1V2V3模型(TensorFlow)【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/81560537新增博客《使用自己的数据集训练MobileNet、ResNet图像识别(TensorFlow)》https://panjinquan.blo…

    2022年8月15日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号