JS闭包原理与应用经典示例

JS闭包是指一个函数能够访问它的外部函数作用域中定义的变量,即使在外部函数返回之后依然有效。

JS闭包原理

在JavaScript中,函数是一等公民,即函数可以作为参数、可以返回值、可以嵌套在另一个函数中,形成闭包。

当函数内部有东西被引用,这里面所引用的内容会一直存在,不会被垃圾回收器清除,这就形成了闭包。

在函数内部定义一个函数,内部函数可以访问外部函数的变量。当外部函数返回时,内部函数仍然可以访问外部函数的变量,这就是闭包。

JS闭包的应用经典示例

1. 实现私有变量

一个普通的函数,内部定义了一个变量a,外部无法访问a:

function aa() {
  var a = 5;
  function f() {
    return a;
  }
}

在上述函数的基础上,定义一个返回函数f的函数,外部可以访问这个闭包函数f,从而访问到a:

function aa() {
  var a = 5;
  return function f() {
    return a;
  }
}

在上述代码中,闭包函数f可以访问a,但是a是私有变量,外部不能修改。由于JavaScript没有块级作用域,使用闭包是实现私有变量的常用方法。

2. 缓存运算结果

在一些需要频繁调用的函数中,使用闭包可以减少不必要的重复计算。例如一个计算乘积的函数:

function multiply(x, y) {
  return x * y;
}

频繁调用multiply函数,需要不停计算乘积。可以使用闭包缓存上次的计算结果,减少重复计算:

function multiply() {
  var cache = {};
  return function(x, y) {
    var key = x + '*' + y;
    if (key in cache) {
      return cache[key];
    } else {
      var result = x * y;
      cache[key] = result;
      return result;
    }
  }
}

上述代码中,定义了一个缓存对象cache,使用key记录x和y的值,如果已经有缓存结果,直接返回,否则计算结果并存入缓存。在之后的调用中,如果发现缓存中已经有计算结果,就直接返回缓存结果,避免了重复计算。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS闭包原理与应用经典示例 - Python技术站

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

相关文章

  • 关于javascript解决闭包漏洞的一个问题详解

    当我们创建闭包时,有时我们会出现闭包漏洞,这是由于我们的闭包中使用了可变的父级作用域变量(比如,引用了 for 循环中的计数器变量),导致我们无法获得我们所期望的结果。 但是,我们可以通过一些方法来解决这个问题: 1. 使用立即执行函数来创建闭包 我们可以使用立即执行函数来包装我们创建闭包的代码,将可变的父级变量传递给一个不可变的参数,从而避免闭包漏洞的发生…

    JavaScript 2023年5月18日
    00
  • 常常会用到的截取字符串substr()、substring()、slice()方法详解

    下面是关于常用的字符串截取方法 substr()、substring()、slice() 的详细讲解。 substr() 方法 substr() 方法用于截取一个字符串的部分内容,它接收两个参数,第一个参数是截取的起始位置,第二个参数是需要截取的字符个数。当第二个参数缺省时,则表示截取到字符串末尾。下面是一个例子: const str = "hel…

    JavaScript 2023年5月28日
    00
  • Iframe跨窗口通信原理详解

    Iframe跨窗口通信原理详解 什么是Iframe? Iframe又被称为内嵌框架,是一种可以将另一个HTML文档嵌入到当前HTML文档的标记。它可以将不同的网页嵌到同一个网页上,使得网页具有嵌套性。 Iframe的跨窗口通信原理 Iframe内部的网页区域和外部的网页区域是完全隔离的,就算是运行在同一个主域名下,它们之间也无法直接通讯。对此,Iframe提…

    JavaScript 2023年6月11日
    00
  • js 利用className得到对象的实现代码

    要使用 JavaScript 利用 className 得到对象,可以使用以下步骤: 获取对象:可以使用 document 对象中的 getElementById 或 getElementsByTagName 方法来捕捉需要获取的对象。如下所示: var obj = document.getElementById(‘myId’); var objList =…

    JavaScript 2023年6月10日
    00
  • 前端JavaScript中的反射和代理

    首先简单介绍一下“前端JavaScript中的反射和代理”是什么意思。JavaScript中的反射和代理主要是针对对象进行操作,反射是指通过内置的API获取对象的属性和方法来进行操作,而代理则是指创建一个中间层来修改对象的行为和属性。 接下来分别详细介绍反射和代理,并提供两个示例说明。 反射 获取对象的属性和方法 在JavaScript中,我们可以使用内置的…

    JavaScript 2023年6月11日
    00
  • js chrome浏览器判断代码

    针对“js chrome浏览器判断代码”的完整攻略,以下是一份详细的解释: 1. 为什么需要JavaScript判断浏览器? 在Web开发中,不同的浏览器可能会对同样的代码产生不同的结果,甚至可能会造成部分功能无法使用,因此在开发过程中,我们需要根据用户所使用的浏览器类型进行代码适配,确保在不同的浏览器下都有良好的用户体验。而JavaScript作为一种运行…

    JavaScript 2023年6月11日
    00
  • javascript设计模式 – 状态模式原理与用法实例分析

    下面是“javascript设计模式 – 状态模式原理与用法实例分析”的完整攻略,包括原理、用法实例分析和示例说明。 前言 状态模式是一种行为型模式,它用一种更好的方式来处理对象状态之间的转换。在这篇文章中,我们将讨论状态模式的原理和用法实例分析。 状态模式原理 状态模式是一种通过使用状态和转换来实现状态转换的行为型模式。在这种模式中,状态表示为一个对象,而…

    JavaScript 2023年6月10日
    00
  • ASP.NET中XML转JSON的方法实例

    下面我将为您详细讲解 ASP.NET 中 XML 转 JSON 的方法实例。 一、XML转JSON的方法介绍 XML 和 JSON 是 Web 应用程序中常用的两种数据格式,但是它们之间的转换并不是十分方便。在 ASP.NET 中,可以使用 JsonConvert 类库实现 XML 转 JSON 的功能。 JsonConvert 是一个类库,它提供了一系列静…

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