闭包的理解

这篇具有很好参考价值的文章主要介绍了闭包的理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.什么是闭包?

变量的私有化。一个函数内的变量,随着函数的执行完毕,对于的变量也会随着销毁,闭包可以让变量在函数执行完毕之后不必销毁,通常将这个变量通过匿名函数的形式return出去,这个变量只能被访问,不能被修改。

2.证明变量执行玩被销毁

(1)函数体没有被包裹之前的打印

    function fn() {
      var a = 10;
      return a++
    }
    console.log(fn());
    console.log(fn());
    console.log(fn());

打印的结果:

闭包的理解,前端

(2)函数体被包裹之后的打印

闭包的理解,前端

可以看出a变量每次都递增了1,从这个结论来看也可以说明a变量是没有被销毁的。

(3)解释不销毁的原因

闭包的理解,前端

return出去一个函数体,这个函数体需要一直访问fn函数,因此a变量不会被销毁,从而实现了递增的效果,因此闭包也被称为变量的私有化

3.闭包的案例

(1)防抖

持续触发不执行,一段时间不触发之后开始执行。

(2)节流的案例

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button id="aa">防抖</button>
  </body>
  <script>
    let btn = document.getElementById("aa");
    var timer;
    btn.addEventListener("click", function () {
      clearInterval(timer);
      timer = setInterval(() => {
        console.log(123);
      }, 2000);
    });
  </script>
</html>

这是一个简单的防抖案例。

(3)思路

我们在写代码之前的第一肯定是想到的是,添加点击事情,然后就是定时器任务,和清除定时器。

清除定时器的应该放在开始定时器的前面。这样在连续点击的时候每次点击就会清掉上一次的定时器

闭包的理解,前端

(4)定时器名字的选择

  代码:

   let btn = document.getElementById("aa");

    btn.addEventListener("click", function () {
      clearInterval(timer);
      let  timer = setInterval(() => {
        console.log(123);
      }, 2000);
    });

闭包的理解,前端

因为let 不会存在变量提升在函数里面定义了,我们要做的第一步就是清除定时器,没有定时器写清除定时器的代码当然会报错, 改成var会怎么样?var 在函数里面会存在变量提升的问题。

 var tiemr;
 clearInterval(timer);

这样代码还没开始,定时器就被清掉了,代码执行的结果:

闭包的理解,前端

(5)定时器名字的敲定

因此这个定时器的名字应该放在函数的外面

(6)代码的封装文章来源地址https://www.toymoban.com/news/detail-709451.html

const debounce = (fn, time) => {
            let timer = null
            return function (...args) {
                clearTimeout(timer)
                // this => oDiv
                timer = setTimeout(() => {
                    // 干啥!
                    fn.apply(this, args) // 调用的时候传递才是实参,window.fn()
                }, time)
            }
        }

到了这里,关于闭包的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入理解JavaScript闭包:从概念到实践

    JavaScript是一门强大且灵活的编程语言,而闭包(Closure)则是JavaScript中一个非常重要且常用的概念。虽然闭包在JavaScript开发中经常被提及,但它的概念和工作原理可能对一些开发者来说仍然有些模糊。本篇博客旨在帮助读者深入理解JavaScript闭包,从概念到实践,让您能够充

    2024年02月16日
    浏览(47)
  • 深入理解作用域、作用域链和闭包

     ​ 🎬 岸边的 风 :个人主页  🔥  个人专栏  :《 VUE 》 《 javaScript 》 ⛺️  生活的理想,就是为了理想的生活 ! ​ 目录  📚 前言  📘 1. 词法作用域 📖 1.2 示例 📖 1.3 词法作用域的应用场景  📘 2. 作用域链 📖 2.1 概念 📖 2.2 示例 📖 2.3 作用域链的应用场景  📘

    2024年02月10日
    浏览(41)
  • 我从来不理解JavaScript闭包,但我用了它好多年

    前言  📫 大家好,我是南木元元,热衷分享有趣实用的文章,希望大家多多支持,一起进步!  🍅  个人主页: 南木元元 你是否学习了很久JavaScript但还没有搞懂闭包呢?今天就来聊一下被很多人誉为JavaScript中最难理解的概念之一的闭包。 目录 闭包的概念 闭包产生的原因

    2024年02月05日
    浏览(54)
  • 深入理解JavaScript堆栈、事件循环、执行上下文和作用域以及闭包

    在JavaScript中,内存堆是内存分配的地方,调用栈是代码执行的地方。 原始类型的保存方式:在变量中保存的是值本身,所以原始类型也被称之为值类型。 对象类型的保存方式:在变量中保存的是对象的“引用”,所以对象类型也被称之为引用类型。 调用栈理解非常简单,当

    2024年02月03日
    浏览(52)
  • Python常见面试题016. 请实现如下功能|谈谈你对闭包的理解

    摘自流畅的python 第七章 函数装饰器和闭包 实现一个函数(可以不是函数)avg,计算不断增加的系列值的平均值,效果如下 跟Python常见面试题015.请实现一个如下功能的函数有点类似,但又不太一样 关键是你需要有个变量来存储历史值 参考代码 avg是个Average的实例 avg有个属性

    2023年04月10日
    浏览(39)
  • 【前端JS交互篇】函数、参数、返回值、闭包函数、递归函数、内存、模块化编程

    函数可以封装一些功能,可以供外部去重复的调用。所以,一般我们把函数叫做具有重复功能的代码块。 JavaScript 基础到高级 Canvas游戏开发 原生JavaScipt案例合集 JavaScript +DOM基础 假设饭店就是一个函数,饭店的功能就是做各种各样的菜,但是具体做什么菜,需要用户来点,用

    2024年02月15日
    浏览(69)
  • 前端常见面试题之js基础(手写深拷贝、原型和原型链、作用域和闭包)

    值类型包括 :字符串(string)、数字(number)、布尔值(boolean)、undefined。 引用类型包括 :对象(object)、数组(array)、函数(function)和null。 二者的区别 当你将一个值类型赋给另一个变量时,会复制该值的副本。而当你将一个引用类型赋给另一个变量时,只会复制对

    2024年01月22日
    浏览(50)
  • 前端工程化详解——理解与实践前端工程化

    前言: 前端工程化一直是一个老生常谈的问题,不管是面试还是我们在公司做基建都会经常提到前端工程化,那么为什么经常会说到前端工程化,并没有听过后端工程化、Java工程化或者Python工程化呢?我们理解的前端工程化是不是一直都是Webpack的性能调优,或者是一个cli工

    2024年02月02日
    浏览(84)
  • 前端Promise理解

    阐述promsie的基本概念 介绍实例方法then、catch、finally 介绍静态方法all、allSettled、race、any、resolve、reject 执行器 executor ◐ 当通过new创建Promise对象时,需要传入一个回调函数,称之为 executor ◐ executor 会在new promise时 会被立即执行 ,并且可传入另外两个回调函数 resolve 、 rej

    2024年02月19日
    浏览(88)
  • 前端需要理解的性能优化知识

    优化的目的是展示更快、交互响应快、页面无卡顿情况。 使用 ChromeDevTool 作为性能分析工具来观察页面性能情况。其中Network观察网络资源加载耗时及顺序,Performace观察页面渲染表现及JS执行情况,Lighthouse对网站进行整体评分,找出可优化项。 DOM的解析受JS加载和执行的影响

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包