javascript中闭包closure的深入讲解

JavaScript中闭包(closure)的深入讲解

在JavaScript中,闭包是一个非常重要的概念,也是面试中经常考察的知识点。下面将深入讲解JavaScript中闭包的概念、特点和使用方法。

什么是闭包

闭包指的是在一个函数内部使用另一个函数的变量,形成了一个作用域链,外部函数或其他地方无法访问这个内部函数的变量,但内部函数可以访问外层函数的变量。

举个例子:

function outer() {
  var a = 1;
  function inner() {
    console.log(a);
  }
  return inner;
}

var result = outer();
result(); // 输出 1

上面的示例中,我们定义了一个名为outer的函数,在outer函数内部定义了一个变量a和一个内部函数innerinner函数可以访问outer函数的变量a并输出。我们将outer函数的返回值赋值给一个变量result,并执行该变量,最终输出结果为1。

在这个例子中,inner函数形成了一个闭包,因为它可以访问外层函数outer的变量a,并且我们通过将inner函数作为outer函数的返回值,保留了outer函数执行时的上下文环境,使得inner函数一直存在并可以调用。

闭包的特点

  • 内部函数可以访问外部函数的变量和参数。
  • 外部函数无法访问内部函数的变量和参数。
  • 内部函数形成了一个闭包,可以持续的存在。

闭包的使用场景

1. 防抖和节流

防抖和节流是常见的优化性能的方式,可以用闭包来实现。

防抖

防抖指的是在一定时间内,多次触发同一事件,只执行最后一次,可以通过闭包保存定时器来实现。

function debounce(fn, delay) {
  var timer;
  return function() {
    var context = this,
        args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function() {
      fn.apply(context, args);
    }, delay);
  }
}

上面的代码中,我们传入一个函数fn和一个时间delay,创建了一个闭包并返回一个新的函数,使用了setTimeout来设置定时器,保存了timer变量,clearTimeout用来清除上一次设置的定时器,防止重复执行。

节流

节流指的是在一定时间内,多次触发同一事件,只执行一次,可以通过闭包保存定时器和上次执行时间来实现。

function throttle(fn, delay) {
  var timer,
      lastTime;
  return function() {
    var context = this,
        args = arguments,
        nowTime = new Date().getTime();
    if (nowTime - lastTime > delay || !lastTime) {
      if (timer) {
        clearTimeout(timer);
        timer = null;
      }
      lastTime = nowTime;
      fn.apply(context, args);
    } else if (!timer) {
      timer = setTimeout(function() {
        fn.apply(context, args);
      }, delay);
    }
  }
}

上面的代码中,我们传入一个函数fn和一个时间delay,创建了一个闭包并返回一个新的函数,使用了setTimeout来设置定时器,保存了timer变量和上次执行时间lastTime,判断两次执行时间间隔是否大于delay,如果是则执行函数并更新lastTime,否则设置定时器等待。

2. 模块化开发

使用闭包可以实现类似于面向对象编程中的私有属性和方法,可以有效的避免全局变量污染。

var myModule = (function() {
  var privateVar = 0;
  function privateMethod() {
    console.log('private method');
  }
  return {
    publicVar: 1,
    publicMethod: function() {
      console.log('public method');
      privateMethod();
      privateVar++;
    }
  }
})();

上面的代码中,我们定义了一个名为myModule的变量,使用了闭包并返回了一个对象,包含了一个公共变量publicVar和一个公共方法publicMethod,同时也定义了一个私有变量privateVar和一个私有方法privateMethod,可以在公共方法中使用私有方法和变量。

总结

闭包是一个非常重要的概念,在JavaScript中使用闭包可以实现很多功能,如防抖和节流、模块化开发等。需要注意的是,由于闭包会占用内存,所以在使用时需要注意内存泄漏问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript中闭包closure的深入讲解 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • js设置cookie过期当前时间减去一秒相当于立即过期

    设置Cookie的过期时间可以通过在Cookie中添加一个用于标识过期时间的Expires属性来实现。通常情况下,Expires属性的值可以是时间戳,表示Cookie的过期时间是基于指定的时间来计算。但如果我们需要相对于当前时间来设置Cookie的过期时间,那么就需要进行一些计算。 具体实现方法是:将当前时间的时间戳减去1秒的时间戳,然后将其转换为UTC格式…

    JavaScript 2023年5月27日
    00
  • ES2020让代码更优美的运算符 (?.) (??)

    ES2020(也称为ES11)引入了两个新的运算符,即可选链运算符(?.)和空值合并运算符(??),以使JavaScript代码更加简洁、简单和易于维护。 可选链运算符(?.) 可选链运算符(?.)可用于在不确定对象是否存在的情况下,可以访问对象或其属性的属性。这是一个非常实用的特性,因为它可以帮助我们避免在访问对象的属性时引发”TypeError”错误,同…

    JavaScript 2023年6月11日
    00
  • Javascript Array constructor 属性

    以下是关于JavaScript Array constructor属性的完整攻略。 JavaScript Array constructor属性 JavaScript Array constructor属性是一个指向创建数组对象的函数的引用。该属性可以用来检测一个对象是否为数组,或者用来创建一个新的数组对象。 下面是一个使用constructor属性的示例:…

    JavaScript 2023年5月11日
    00
  • js获取浏览器的各种属性

    当我们需要编写网页时,能够获取浏览器属性的JS脚本的价值是非常巨大的。下面,我们将详细讲解下如何获取浏览器的各种属性。 1. 获取浏览器窗口大小 我们可以通过window.innerWidth和window.innerHeight属性来获取当前窗口的宽度和高度。以下是一个示例代码块: let windowWidth = window.innerWidth; …

    JavaScript 2023年6月11日
    00
  • JavaScript的查询机制LHS和RHS解析

    JavaScript中存在两种类型的查询机制,即左查询(LHS)和右查询(RHS)。这两种查询机制可以帮助我们理解JavaScript变量的赋值过程。下面详细讲解一下这两种查询机制。 LHS查询 LHS查询通常发生在变量被赋值的时候,这种查询的目的是为了找到变量所在的内存地址,当变量所在的内存地址存在时,就可以把该值赋给变量。如果变量所在内存地址在运行时不存…

    JavaScript 2023年5月28日
    00
  • js学使用setTimeout实现轮循动画

    接下来我将分享使用setTimeout实现轮循动画的攻略。 什么是setTimeout函数? 在介绍如何使用setTimeout实现轮循动画之前,我们需要了解一下什么是setTimeout函数。 setTimeout函数是JavaScript中一个非常重要的函数,它的作用是在指定的时间后执行一段指定的函数。由于setTimeout是异步函数,所以它不会影响当…

    JavaScript 2023年6月11日
    00
  • JavaScript定时器实现无缝滚动图片

    下面我来介绍一下如何使用JavaScript定时器实现无缝滚动图片的完整攻略。 实现思路 首先,我们需要明确我们要实现的功能:无缝滚动图片。那么,如何做到无缝呢?想必大家都知道,无缝滚动就是前面的图片轮廓从右边消失,后面的图片轮廓从左边补上去,这样的效果看起来就像是图片一直在匀速滚动一样。 因此,我们可以考虑将一排图片放在一个盒子里,利用定时器来操纵图片的位…

    JavaScript 2023年6月11日
    00
  • JavaScript实现弹出广告功能

    要实现JavaScript弹出广告功能,首先需要了解以下几个知识点: 1.如何触发弹窗 2.如何获取屏幕宽度和高度 3.如何定时关闭弹窗 4.如何在页面中添加HTML元素 下面,我将详细介绍如何实现JavaScript弹出广告功能。 1. 触发弹窗 触发弹窗的方式有多种,最基本的方式是通过点击按钮或者链接触发。比如,在页面中添加一个按钮,点击按钮时弹出广告。…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部