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

yizhihongxing

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日

相关文章

  • 强烈推荐-ajax开发者必看的文章第2/3页

    强烈推荐-AJAX开发者必看的文章第2/3页攻略 如果你是一个AJAX开发者,则有必要学习第2/3页的文章的内容。这篇攻略将帮助你快速掌握这些文章的核心思想和技巧。 为什么要学习这些文章 AJAX已经成为了现代Web开发的一个重要组成部分。了解AJAX的核心思想和技巧有助于你更好地理解和应用AJAX技术,从而提高Web应用的性能和用户体验。 第2/3页的文章…

    JavaScript 2023年6月11日
    00
  • element UI中在 el-select 与 el-tree 结合组件实现过程

    如果想要在Element UI中通过一个下拉菜单选择树节点,在代码中的实现过程中,我们需要将el-tree组件的节点数据绑定在el-select组件中。下面是实现过程的详细攻略: 1. 被选择节点的数据获取 我们先给el-tree添加ref属性,这样我们在javascript中可以通过$refs属性访问到el-tree组件的实例对象,进而获取到我们选择的节点…

    JavaScript 2023年6月10日
    00
  • 一文带你简单封装JS下的异步任务对象

    下面是关于“一文带你简单封装JS下的异步任务对象”的完整攻略。 前言 异步编程到现在已经是一个非常成熟的概念,并且也是前端开发中非常重要的一环。在JavaScript中,常见的异步操作包括网络请求、读写文件等。但是在异步操作中,由于异步事件的不确定性,使得相关代码比同步代码更难以理解、调试以及维护。为了更优雅地解决这个问题,我们可以使用异步任务对象的方式来封…

    JavaScript 2023年6月10日
    00
  • TypeScript 泛型的使用

    TypeScript 泛型的使用 泛型是指在定义函数、接口或类时,不预先指定具体的类型,而在使用时再指定类型的一种特性。它可以让我们写出更加灵活、通用的代码,并提高代码的复用性。 泛型函数 定义一个泛型函数的语法为: function 函数名<T>(参数1: T, 参数2: T, …): T { // 函数体 } 其中,函数名后面的 <…

    JavaScript 2023年5月28日
    00
  • 深入理解javascript的执行顺序

    深入理解JavaScript的执行顺序是编写优秀JavaScript代码的基础。JavaScript的执行顺序遵循一定的规则,理解这些规则可以帮助我们理解代码的执行顺序,避免出现错误。 1. 执行栈 在深入了解JavaScript的执行顺序之前,我们需要了解执行栈的概念。执行栈是一个存储函数调用的栈结构,当JavaScript代码执行的时候,函数调用会被依次…

    JavaScript 2023年5月18日
    00
  • javascript之函数进阶详解

    JavaScript之函数进阶详解 函数的三种表现形式 JavaScript中的函数有三种表现形式:函数声明、函数表达式和箭头函数。其中,函数声明和函数表达式是最常见的形式。 函数声明 函数声明语法如下: function functionName(parameter1, parameter2, …parameterN) { // function bo…

    JavaScript 2023年5月18日
    00
  • 为什么使用DOCTYPE HTML

    当我们编写HTML文档时,必须在文件开头加上文档类型声明(DOCTYPE),该声明告诉浏览器的解释器HTML文档的类型以及使用的版本。在HTML5中,文档类型定义如下: <!DOCTYPE html> 它是HTML5文档类型的标准声明。但是,在开发中,可能会遇到一些旧的HTML文档类型声明,如XHTML、HTML4等。在这种情况下,我们应该使用与…

    JavaScript 2023年6月11日
    00
  • JS正则表达式替换字符串replace()方法实例代码

    下面是关于JS正则表达式替换字符串replace()方法的详细攻略: 什么是JS正则表达式替换字符串replace()方法? 在JavaScript中,字符串replace() 方法可以将一个字符串中的指定内容替换成新的内容,这有很多应用场景。其中,JS正则表达式替换字符串replace()方法,可以让开发者使用正则表达式来进行替换操作,更加高效和灵活。 J…

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