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日

相关文章

  • 最新JS正则表达式验证邮箱和手机号实例(2022)

    针对这篇“最新JS正则表达式验证邮箱和手机号实例(2022)”文章,我将提供完整攻略如下: 文章概览 了解文章主题 确定验证目标:邮箱和手机号 设计验证规则:使用正则表达式 实现邮件和手机号码验证 确定验证目标:邮箱和手机号 在阅读这篇文章后,我们了解到验证目标是邮箱和手机号。在开始验证规则设计之前,首先需要了解邮箱和手机号的基本格式。 邮箱格式 一般的邮箱…

    JavaScript 2023年6月10日
    00
  • JS实现时间选择器

    JS实现时间选择器的攻略需要遵守以下步骤: 1. 准备工作 首先需要在页面中引入需要用到的JS库,例如jQuery或者Zepto。可以通过CDN或者下载本地使用。 2. 创建HTML结构 时间选择器需要一个输入框来显示选中的时间,同时还需要一个弹窗来显示时间选择器控件。HTML结构可以按照以下方式构建: <div class="form-gr…

    JavaScript 2023年5月27日
    00
  • asp javascript在线管理

    下面我将为您详细讲解“ASP Javascript在线管理”的攻略。 什么是“ASP Javascript在线管理”? “ASP Javascript在线管理”是一种基于ASP(Active Server Pages)技术和Javascript脚本语言实现的在线管理系统。它可以让用户通过网页界面对服务器上的文件进行管理和操作,比如上传文件、创建文件夹、删除文…

    JavaScript 2023年6月10日
    00
  • JavaScript严格模式

    JavaScript严格模式是一种JavaScript的语言模式,它具有更严格的语法规则和更加安全的行为。使用严格模式可以更早地检测出代码错误,并防止一些常见的JavaScript陷阱。在本文中,我们将深入探讨JavaScript严格模式,介绍它的用法、优势和限制,并提供代码示例。 1.使用严格模式 启用JavaScript严格模式的方法很简单:只需要在代码…

    Web开发基础 2023年3月30日
    00
  • JavaScript对象属性检查、增加、删除、访问操作实例

    JavaScript对象属性检查、增加、删除、访问操作实例 在JavaScript中,对象是一组无序的相关属性的集合,可以使用对象属性来存储和访问数据。在使用JavaScript对象时,我们常常需要进行属性检查、增加、删除和访问操作。下面是详细的攻略。 1. 属性检查 属性检查可以用于判断某个对象是否包含某个属性,在JavaScript中有两种方式进行属性检…

    JavaScript 2023年5月27日
    00
  • 在JavaScript中处理时间之setMinutes()方法的使用

    在JavaScript中处理时间之setMinutes()方法的使用 在JavaScript中,我们可以使用Date对象来处理时间。其中,setMinutes()方法用于设置一个日期对象的分钟数。 setMinutes()方法的语法 dateObject.setMinutes(minutesValue[, secondsValue[, msValue]]) …

    JavaScript 2023年5月27日
    00
  • javascript中window.open在原来的窗口中打开新的窗口(不同名)

    首先,我们需要了解 window.open() 这个函数,它能打开一个新的浏览器窗口或选项卡并返回新窗口的引用。它可以传递一些参数,如新窗口的 URL、名称、大小等等。 如果我们想在原来的窗口中打开一个新的窗口,可以使用以下代码: window.open("http://www.example.com", "_self&quot…

    JavaScript 2023年6月11日
    00
  • JavaScript的Date()方法使用详解

    JavaScript的Date()方法使用详解 介绍 Date() 方法以字符串或数值为参数创建一个新的 Date 对象。如果不传递参数,Date() 将返回当前时间。 语法 new Date(); new Date(value); new Date(dateString); new Date(year, month, day, hours, minutes…

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