JavaScript闭包详解

JavaScript闭包详解

什么是闭包

闭包是指在一个函数内部定义的函数可以访问该函数的上下文环境中的变量和函数,即使在函数外部访问该函数的上下文环境也是无法访问到的。

举个例子:

function outer() {
  var name = "张三";
  function inner() {
    console.log(name); // 可以访问外部函数中定义的变量
  }
  return inner;
}

var innerFun = outer();
innerFun(); // "张三"

在这个例子中,函数inner()嵌套在另一个函数outer()内部,它可以访问outer()函数中定义的变量name。在outer()函数中,返回内层函数inner()的引用,这就形成了一个闭包。

闭包的应用场景

闭包的应用有很多,其中最常见的是在封装对象的时候,使对象的部分属性或方法对外部不可访问。

封装变量

在JavaScript中,没有真正的私有变量。但是,如果我们定义一个函数并立即执行它,那么内部变量就会被封装,并且只能通过返回的函数才能访问到它们。这种方法被称为模块模式。

示例代码如下:

var obj = (function() {
  var name = "张三";
  var age = 18;
  function getName() {
    return name;
  }
  function getAge() {
    return age;
  }
  return {
    getName: getName,
    getAge: getAge
  }
})();

console.log(obj.getName()); // "张三"
console.log(obj.getAge()); // 18

在这个例子中,我们定义了一个立即执行的匿名函数,并返回一个包含getName()getAge()方法的对象。这些方法内部访问了闭包中的name和age变量,但是从外部无法访问。

记忆化函数

记忆化是一个非常有用的技巧,可以根据函数的输入缓存运算结果,以避免重复计算。下面是一个例子,计算斐波那契数列中的第n项。

function fibonacci(n) {
  if (n === 1 || n === 2) {
    return 1;
  }
  return fibonacci(n - 1) + fibonacci(n - 2);
}

如果我们计算fibonacci(40),那么这个函数就会被调用1346269次,导致程序非常慢。考虑使用记忆化技巧。

function fibonacci(n) {
  var cache = {};
  function inner(num) {
    if (num === 1 || num === 2) {
      return 1;
    }
    if (cache[num]) {
      return cache[num]; // 从缓存中返回结果
    }
    var result = inner(num - 1) + inner(num - 2);
    cache[num] = result; // 缓存结果
    return result;
  }
  return inner(n);
}

在这个例子中,我们定义了一个内部函数inner(),它访问了一个闭包中的变量cache。cache保存了已经计算过的结果,如果我们已经计算过结果,那么直接从cache中返回结果即可。这个问题的计算复杂度被降低到了O(n),且即使是计算较大的斐波那契数列,也能非常快速地完成。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript闭包详解 - Python技术站

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

相关文章

  • javascript实现自动输出文本(打字特效)

    下面是JavaScript实现自动输出文本(打字特效)的完整攻略。 1. 前置知识 JavaScript基础知识 HTML/CSS基础知识 DOM基础知识 2. 确定需求 在实现自动输出文本的过程中,我们需要考虑以下问题: 输出文本的内容是什么? 文本输出的速度是多少? 每个字符输出的间隔时间是多少? 3. 实现步骤 3.1 HTML结构 首先,我们需要准备…

    JavaScript 2023年5月28日
    00
  • Node.js中使用Buffer编码、解码二进制数据详解

    当我们需要处理二进制数据时,就需要使用到Node.js的Buffer API。Buffer API是用于处理二进制数据的API,可以将数据流转换为Buffer对象,进行编码、解码、拼接、拆分等操作。 创建Buffer对象 首先,我们需要创建一个Buffer对象来存储我们的二进制数据。可以通过下面的几种方式创建: 方法一:通过字符串创建Buffer对象 con…

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

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

    JavaScript 2023年6月11日
    00
  • 详解JavaScript实现简单的词法分析器示例

    下面是详解“详解JavaScript实现简单的词法分析器示例”的完整攻略: 一、词法分析器概述 词法分析器是编译器中最简单的部分之一,它的主要功能是将代码分解为有意义的词法单元,例如关键字、标识符、常量、操作符等。在构建词法分析器时,我们可以使用许多工具和技术,例如正则表达式、自动机、递归下降解析器等。 二、实现一个简单的词法分析器 下面我们将介绍如何使用J…

    JavaScript 2023年5月28日
    00
  • JavaScript对象反射用法实例

    当我们谈及JavaScript对象反射用法实例时,我们通常指的是使用JavaScript内置的反射API(如Object.keys()和Object.getOwnPropertyNames())来检索和操作对象的属性和方法。以下是使用JavaScript对象反射的两个实例: 实例1: 我们有一个存储着用户详细信息的对象user,如下所示: var user …

    JavaScript 2023年5月27日
    00
  • JavaScript的Function详细

    JavaScript的Function详细攻略 什么是函数 函数是一段能够完成特定任务的可重复使用的代码。它们可以接受输入和返回输出。 在JavaScript中,函数是一等公民,这意味着它们被认为是值,并且可以作为参数传递给其他函数或由其他函数返回。 函数定义如下所示: function functionName(parameter1, parameter2…

    JavaScript 2023年5月18日
    00
  • 各种页面定时跳转(倒计时跳转)代码总结

    “各种页面定时跳转(倒计时跳转)代码总结”是一个非常常见的前端需求,现在我来为大家介绍如何实现这个功能。 前置知识 在学习页面定时跳转之前,需要先了解一些前置知识: HTML 与 CSS的编写与使用; JS的基础语法和基本操作; 对定时器的理解以及使用方法。 分别实现普通定时跳转和倒计时跳转 实现普通定时跳转 普通定时跳转也就是固定时间内跳转,可以通过以下代…

    JavaScript 2023年6月11日
    00
  • JS检测页面中哪个HTML标签触发点击事件的方法

    要检测页面中哪个HTML标签触发了点击事件,我们可以使用JavaScript语言提供的事件监听函数来实现。以下是实现的步骤: 获取页面中所有的HTML标签 我们可以使用document.querySelectorAll()方法获取页面中所有的HTML标签,该方法返回一个NodeList对象,我们可以使用forEach()方法遍历其中的每一个标签。 示例代码:…

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