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验证不重复验证码

    关于 “JS验证不重复验证码”的完整攻略,我将按以下步骤讲解。 第一步:在前端生成并展示验证码 首先,在前端页面中,我们需要生成一个验证码,可以使用不同的方式,如下面的代码示例所示: <div> <label for="captcha-input">验证码:</label> <input type…

    JavaScript 2023年6月10日
    00
  • 实例详解JavaScript中setTimeout函数的执行顺序

    接下来我将详细讲解“实例详解JavaScript中setTimeout函数的执行顺序”的完整攻略。 一、背景介绍 在JavaScript中,setTimeout函数是一种异步操作,可以实现延迟执行某个函数或代码块的功能。在使用setTimeout时,我们需要了解其执行顺序和一些注意事项,才能保证程序的正确性。 二、setTimeout函数的基本用法 setT…

    JavaScript 2023年5月28日
    00
  • 深入探究JS中的异步编程和事件循环机制

    深入探究JS中的异步编程和事件循环机制 在JavaScript中,异步编程是必不可少的。它可以使我们的程序变得更加高效,同时也可以避免一些由于阻塞线程而导致的问题,比如用户界面的卡顿等。异步编程的核心机制就是事件循环,下面将详细探究JavaScript中的异步编程和事件循环机制。 异步编程 JavaScript是单线程的语言,这意味着它只有一个主线程来处理执…

    JavaScript 2023年5月28日
    00
  • java实现app签到功能

    实现App签到功能主要涉及到前端和后端两个方面的开发,其中前端主要负责 UI 设计和用户交互,后端主要负责数据存储和业务逻辑实现。 下面是一些具体的步骤和示例说明: 第一步:设计数据库表 在设计数据库表时,需要考虑到存储哪些数据以及如何进行查询。下面是一个简单的签到记录表: CREATE TABLE check_in_record ( id INT(11) …

    JavaScript 2023年5月28日
    00
  • 你真的了解BOM中的history对象吗

    当涉及到浏览器对象模型(BOM)时,常用的对象之一就是history对象。 这个对象允许我们访问正在打开并已经关闭的浏览器窗口的历史记录。 1. history对象简介 history对象是浏览器的窗口历史记录, 它是Window对象中的一个属性,可以使用window.history属性来访问它。history对象包含用户在浏览器中访问的所有页面的历史记录,…

    JavaScript 2023年6月11日
    00
  • JavaScript 日期和时间的格式化方法

    JS 日期和时间的格式化方法在开发中经常会用到,可以将日期和时间按照指定格式输出。下面是一份详细的攻略。 日期和时间的格式化方法 在JavaScript中,日期和时间可以使用 Date() 对象来表示。而要对日期进行格式化,就需要将 Date() 中的内容按照指定的格式进行输出。下面介绍三种常见的格式化方式。 1. 使用 toDateString() toD…

    JavaScript 2023年5月27日
    00
  • asp.net不同页面间数据传递的多种方法

    ASP.NET是一种强大的Web应用程序框架,提供了多种方法来传递不同页面间的数据。下面从多种角度介绍ASP.NET不同页面间数据传递的多种方法: QueryString QueryString是将数据以键值对的形式追加在URL后面,通常用于将简单的数据传递给ASP.NET页面。可采用以下代码将数据传递给页面: <a href="Defaul…

    JavaScript 2023年6月11日
    00
  • 浅谈setTimeout 与 setInterval

    浅谈setTimeout与setInterval 简介 在JavaScript中,setTimeout与setInterval是常用的计时器函数。它们可以用来定时执行函数,控制代码的执行流程。本文将从以下几个方面对setTimeout与setInterval进行详细讲解。 setTimeout的用法及注意事项 setInterval的用法及注意事项 setT…

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