JavaScript中闭包的写法和作用详解

JavaScript中闭包的写法和作用详解

什么是闭包

闭包是指有权访问另一个函数作用域中的变量的函数。闭包是JavaScript中最强大的特性之一,也是最容易误用而降低性能的特性之一。

举个例子:

function outer() {
  let name = "Bob";
  function inner() {
    console.log(name);
  }
  return inner;
}
let func = outer();
func(); // 输出 Bob

在这个例子中,我们定义了一个outer函数,它返回了一个inner函数。inner函数中访问了name变量,而这个变量在outer函数作用域中定义。调用outer函数会返回一个inner函数,我们把这个函数赋值给变量func,最后调用func函数会输出 Bob。

这个过程中,inner函数访问了outer函数中的变量,而outer函数已经执行完毕,这时候如果不使用闭包,name就会被垃圾回收器回收掉,inner函数无法访问它,也就无法正确输出 Bob。

闭包的写法

在JavaScript中,闭包的写法有两种:

1. 函数作为返回值

function outer() {
  let name = "Bob";
  function inner() {
    console.log(name);
  }
  return inner;
}
let func = outer();

这个例子中,我们定义了一个outer函数,它返回了一个inner函数。在调用outer函数之后,我们把返回值赋值给了变量func。最后调用func函数会输出 Bob。

2. 函数作为参数

function outer(func) {
  let name = "Bob";
  func(name);
}
function inner(name) {
  console.log(name);
}
outer(inner); // 输出 Bob

这个例子中,我们定义了一个outer函数,它接受一个函数作为参数。在outer函数内部,我们定义了一个字符串name,然后把name作为参数传递给了传入的函数func。在这个例子中,我们把inner函数作为参数传递给了outer函数,inner函数内部访问了name变量并输出了它。最后调用outer函数会输出 Bob。

闭包的作用

闭包有以下几个作用:

1. 封装变量

使用闭包可以将变量封装起来,防止它们被外部访问和修改,以达到数据安全的目的。例如:

function counter() {
  let count = 0;
  function increment() {
    count++;
  }
  function decrement() {
    count--;
  }
  function getCount() {
    return count;
  }
  return {
    increment,
    decrement,
    getCount
  };
}
let c = counter();
c.increment();
c.increment();
c.decrement();
console.log(c.getCount()); // 输出 1

在这个例子中,我们定义了一个counter函数,它返回了一个包含三个函数的对象。这三个函数分别是increment、decrement和getCount,它们均访问了count变量。由于count变量只在counter函数的作用域中,因此它们是外部无法访问和修改的,从而实现了封装的效果。

2. 延长变量的生命周期

使用闭包可以延长变量的生命周期,防止它们过早被垃圾回收器回收掉,以达到保存状态的目的。例如:

function bindEvent() {
  let btn = document.getElementById("btn");
  let count = 0;
  btn.addEventListener("click", function() {
    count++;
    console.log(count);
  });
}
bindEvent();

在这个例子中,我们定义了一个bindEvent函数,在其中监听了一个按钮的点击事件,每次点击按钮会输出一个数字,这个数字代表了点击的次数。由于count变量被click事件回调函数所引用,因此即使bindEvent函数执行完毕,count变量仍然存在,并且每次点击按钮都会增加它的值,达到了保存状态的效果。

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

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

相关文章

  • JavaScript编程的单例设计模讲解

    JavaScript编程的单例设计模式讲解 在JavaScript开发中,单例模式是一个常见的设计模式。它可以保证一个类只有一个实例,并提供一个全局可访问该实例的访问点。 使用场景 当一个对象需要在整个应用程序中只有一个实例时,就可以考虑使用单例模式。如: 全局状态管理 路由管理 模态框管理 数据库连接池 WebSocket连接管理等。 基本实现方式 let…

    JavaScript 2023年6月10日
    00
  • 前端开发基础javaScript的六大作用

    下面我将为你详细讲解“前端开发基础 JavaScript 的六大作用”。 一、动态效果 JavaScript 可以通过操作 DOM(文档对象模型),动态地改变页面的元素、内容等,实现动态效果。比如,我们可以通过 JavaScript 实现一个点击按钮,显示或隐藏一些内容的动态功能。下面是一个示例代码: // 在点击按钮时,显示或隐藏 div 元素 const…

    JavaScript 2023年5月18日
    00
  • 工作中常用js功能汇总

    工作中常用js功能汇总 在工作中,我们经常会使用一些常用的 JavaScript 功能来实现不同的需求。本文将详细讲解一些常用的 JavaScript 功能,包括事件监听、DOM 操作、异步请求、正则表达式、日期时间操作等。 事件监听 事件监听是将 JavaScript 代码与 HTML 元素的交互相连的主要方式。添加事件监听器的方法是使用 addEvent…

    JavaScript 2023年5月18日
    00
  • javascript格式化json显示实例分析

    接下来我将为你详细讲解“JavaScript格式化JSON显示实例分析”的完整攻略。 什么是JSON JSON是JavaScript Object Notation的缩写,是一种轻量级的数据交换格式。JSON使用文本来描述数据对象,与XML不同,JSON更容易阅读、编写、解析,因为它的语法格式比XML更简洁。 格式化JSON 在处理JSON格式的数据时,我们…

    JavaScript 2023年5月27日
    00
  • JavaScript实现自动生成网页元素功能(按钮、文本等)

    让我们来详细讲解一下“JavaScript实现自动生成网页元素功能(按钮、文本等)”的完整攻略。 1. 需求分析 要实现自动生成网页元素功能,首先需要明确我们的需求和目标。我们的目标是在用户输入指定的元素类型和数量后,自动生成对应的HTML元素,比如按钮、文本输入框等。可以参考以下的需求分析: 需要一个表单,供用户填写元素类型和数量。表单设计可以参考以下样式…

    JavaScript 2023年6月10日
    00
  • 基于dataset的使用和图片延时加载的实现方法

    为了给你更全面的介绍,我将分为两部分来解答你的问题。 基于 dataset 的使用 dataset是HTML5中新增的一个属性,用于为元素存储自定义数据。它可以为我们提供一种方便快捷的方式来访问元素存储的数据,而不需要通过其他的方式来操作元素的属性。 增加数据 <body> <div data-name="zhangsan&quo…

    JavaScript 2023年6月10日
    00
  • JavaScript获取多个数组的交集简单实例

    下面我将详细讲解 JavaScript 获取多个数组的交集的完整攻略。 什么是数组的交集? 数组的交集是指两个或多个数组中共同存在的元素。 例如,对于两个数组 arr1 = [1, 2, 3, 4, 5] 和 arr2 = [3, 4, 5, 6, 7],它们的交集为 [3, 4, 5]。 实现数组的交集 下面我们来讲解具体实现来获取多个数组的交集,我们可以…

    JavaScript 2023年5月27日
    00
  • JavaScript原型与原型链深入探究使用方法

    JavaScript原型与原型链深入探究使用方法 原型 JavaScript中每个函数都有一个prototype属性,它指向一个对象。这个对象就是所谓的“原型对象”或“原型”。我们可以在原型对象上添加方法和属性,这些方法和属性可以被构造函数创建的实例所共享。在原型对象上定义的方法和属性,可以被该构造函数所创建的所有实例共享使用。这样,我们就可以省略实例中相同…

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