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代码应该放在HTML代码哪个位置比较好?

    当我们编写JavaScript代码时,应该考虑将其放在HTML中的哪个位置。这样可以提高网站性能、可维护性和可靠性。 一般来说,可以将JavaScript代码放在HTML文档的头部或尾部,或者在文档中间使用异步加载。下面分别介绍这三种放置JavaScript代码的方式。 1.头部 将JavaScript代码放在头部,可以确保所有代码都被下载和解释,但是可能会…

    JavaScript 2023年5月27日
    00
  • 实例讲解javascript注册事件处理函数

    当我们需要让页面元素触发一些行为时,就需要使用JavaScript来为元素绑定事件处理函数。在JavaScript中,可以通过为元素添加一个事件处理函数来捕获指定的事件类型,例如按钮的click事件、键盘按键事件等。本篇攻略将详细介绍如何使用JavaScript注册事件处理函数,并提供两个实例来说明事件处理的具体应用。 注册事件处理函数的方法 JavaScr…

    JavaScript 2023年6月10日
    00
  • Three.js实现脸书元宇宙3D动态Logo效果

    下面就是详细讲解“Three.js实现脸书元宇宙3D动态Logo效果”的完整攻略。 1. 了解 Three.js Three.js 是一款使用 WebGL 技术实现的 JavaScript 3D 库,是基于WebGL的抽象封装实现库。 它可以很方便的创建、加载、修改3D 场景,包含了诸如相机、灯光、材质、物体、场景等等的封装。 2. 准备工作 先建立一个场景…

    JavaScript 2023年5月28日
    00
  • js构造函数创建对象是否加new问题

    当使用 JavaScript 构造函数创建对象时,可以选择是否使用 new 关键字。如果使用了 new 关键字,则会创建一个新的对象并将其绑定到 this 上,最后返回这个新的对象。如果没有使用 new 关键字,则 this 被绑定到全局对象上,这可能导致一些意外的问题。 下面给出两个示例展示使用和不使用 new 关键字的区别。 示例一 function P…

    JavaScript 2023年6月11日
    00
  • JS 判断某变量是否为某数组中的一个值的3种方法(总结)

    下面是关于JS判断某变量是否为某数组中的一个值的3种方法的详细攻略。 标准方法:Array.prototype.indexOf() Array对象有一个原型方法indexOf(),可以用来查找数组中是否包含某个元素。使用该方法来判断某变量是否为某数组中的一个值,需要先调用indexOf()方法查找该元素在数组中的索引值。若索引值不为 -1(即查找到该元素),…

    JavaScript 2023年5月27日
    00
  • js实现简单实用的AJAX完整实例

    看来你对AJAX还是有一些疑问,下面我来给你讲解JS如何实现简单实用的AJAX完整实例。 AJAX是什么 在开始之前,首先我们需要明确AJAX的概念。AJAX全称是Asynchronous JavaScript and XML,也就是异步的JavaScript和XML。它实际上是指利用JavaScript在不刷新整个页面的情况下,向服务器异步请求数据,并将数…

    JavaScript 2023年6月11日
    00
  • div css 实现tabs标签的思路及示例代码

    让我来为你详细讲解如何使用div和CSS实现tabs标签。 一、思路 假设我们需要实现一个tabs标签,首先需要以下几步: 将标签划分为两部分:内容区和导航区; 内容区包含全部标签页的内容,导航区用于切换标签页; 导航区的每个按钮都有一个相对应的标签页,点击导航区的某个按钮可以显示对应的标签页; 显示的标签页需要隐藏其他标签页,以显示当前标签页的内容。 基于…

    JavaScript 2023年6月11日
    00
  • javascript表单控件实例讲解

    JavaScript表单控件实例讲解 JavaScript是一种脚本语言,经常用于网页中对用户输入信息的校验和处理。表单是用户和服务器之间交换数据的最主要方式之一,JavaScript正是被广泛用于表单交互的。 表单控件分类 表单控件通常分为以下几类: 文本类控件:包括文本框、密码框、文本域等; 选择类控件:包括单选框、复选框、下拉框等; 文件上传类控件:用…

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