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日

相关文章

  • Javascript中的解构赋值语法详解

    Javascript中的解构赋值语法详解 Javascript解构赋值语法是一种简洁、高效的变量声明和赋值方式,可以在一行代码中完成多个变量的赋值。在Javascript ES6中,引入了解构赋值语法,使得变量的声明和赋值变得更加简便。下面我们来详细讲解Javascript中的解构赋值语法。 一、数组解构赋值 1. 数组解构赋值介绍 数组解构赋值,指的是将数…

    JavaScript 2023年5月27日
    00
  • Javascript基础回顾之(一) 类型

    Javascript基础回顾之(一) 类型 在 Javascript 中,数据类型是对值的分类。值可以是基本类型或对象类型。本文将重点回顾以下六种基本类型: Undefined Null Boolean Number String Symbol Undefined 当声明一个变量但不对它进行初始化时,它的值就为 undefined。例如: let a; co…

    JavaScript 2023年5月18日
    00
  • js判断文件格式及大小的简单实例(必看)

    正如该文章标题所示,该篇文章提供的是一个关于使用JavaScript来判断文件格式及大小的简单实例。文章主要分为两个部分:判断文件格式和判断文件大小。 判断文件格式 如果想要判断一个文件的格式,一般可以通过文件的后缀名来进行判断。比如说,通常”jpeg”后缀的文件都是jpg格式,”png”后缀的文件都是png格式,等等。 下面我们来看一下代码示例: func…

    JavaScript 2023年5月27日
    00
  • 常用的9个JavaScript图表库详解

    常用的9个JavaScript图表库详解 1. Chart.js Chart.js 是一个使用 HTML5 canvas 元素创建图表的 JavaScript 库。它可以绘制多种类型的图表,例如线性图、柱状图、饼图等等。 Chart.js 具有良好的文档和易于使用的 API。它适合初学者和有经验的开发者。 以下是一个简单的例子: <canvas id=…

    JavaScript 2023年5月27日
    00
  • 详解如何较好的使用js

    如何较好地使用 JavaScript 在网站开发中,JavaScript 是一个重要的工具。下面,我将分享一些如何最好地使用 JavaScript 的攻略,以便您可以将 JavaScript 发挥到最大的作用。 熟练掌握 JavaScript 语言基础 在编写 JavaScript 代码之前,首先需要了解基础语法,如数据类型、变量和运算符等。另外,熟练掌握流…

    JavaScript 2023年6月11日
    00
  • JavaScript遍历DOM元素的常见方式示例

    当我们需要操作DOM以实现页面的交互效果时,我们需要遍历DOM元素。以下是几种常见的JavaScript遍历DOM的方式: 1. 通过节点关系遍历 在DOM中,节点之间有父子、兄弟、前后关系,利用这些关系可以方便地遍历DOM节点。主要有以下几个属性和方法: parentNode:获取当前节点的父节点; childNodes:获取当前节点的所有子节点(注意,子…

    JavaScript 2023年6月10日
    00
  • javascript实时获取鼠标坐标值并显示的方法

    下面就详细讲解一下“JavaScript实时获取鼠标坐标值并显示的方法”。 方法一:使用mousemove事件 我们可以通过mousemove事件实时获取鼠标的坐标值,然后将其显示在页面上。这里给出一个示例代码: <div id="mouse">鼠标坐标:</div> <script> var mous…

    JavaScript 2023年6月11日
    00
  • 最新热门脚本Autojs源码分享

    最新热门脚本Autojs源码分享攻略 Autojs是一款Android平台下的JavaScript自动化工具,可以实现自动点击、滑动、输入等操作。同时也是一个优秀的脚本引擎,支持JavaScript语法和ES6规范。在Autojs社区中,可以找到各种各样的脚本,涵盖了各种应用场景。这篇攻略将详细讲解如何获取、使用Autojs脚本以及如何调试脚本。 步骤一:获…

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