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日

相关文章

  • js传参数受特殊字符影响错误的解决方法

    当使用JavaScript进行参数传递的时候,如果传递的参数中包含特殊字符,可能会出现错误。这种错误的解决方案可以通过对参数进行转义处理。 1. encodeURI() 和 decodeURI() 函数 使用encodeURI() 和 decodeURI() 函数可以对参数进行编码和解码。这两个函数都是全局对象的方法。 encodeURI()方法将一个字符串…

    JavaScript 2023年5月19日
    00
  • AS3 js正则表达式 反向引用(backreference)

    AS3是指Adobe Flash平台的ActionScript语言版本3,而JS则是指JavaScript语言。在这两者中,都可以使用正则表达式(Regular Expression)来匹配和处理字符串。反向引用(Backreference)是正则表达式中的元字符之一,其可以用于匹配已经匹配过的子模式。 反向引用的语法为“\数字”,其中“数字”表示前面已经定…

    JavaScript 2023年6月10日
    00
  • 浅谈js的html元素的父节点,子节点

    当我们在编写 JavaScript 代码时,我们经常需要对 HTML 页面中的元素进行操作,而理解 HTML 元素的父节点和子节点是非常重要的。在本文中,我们将深入讨论这个话题并为您提供完整攻略。 HTML 元素的父节点和子节点 在 HTML 中,父节点表示该节点的上一级节点,而子节点是该节点的下一级节点。例如,如果我们有一个 div 元素,它包含一个 p …

    JavaScript 2023年6月10日
    00
  • js实现动画特效的文字链接鼠标悬停提示的方法

    下面我来详细讲解下“js实现动画特效的文字链接鼠标悬停提示的方法”: 1. 实现动画特效的方法: 一般情况下,我们可以通过 CSS 的 transition 或者 animation 属性实现动画效果。首先,我们可以定义一个类名,比如:.animated,用来标记需要实现动画效果的元素。代码如下: .animated { transition: all .3…

    JavaScript 2023年6月11日
    00
  • JS FormData对象使用方法实例详解

    JS FormData对象使用方法实例详解 什么是FormData对象 FormData对象是JavaScript提供的一种数据处理对象,主要用来实现表单数据的序列化操作、数据的自动编码以及数据传输等功能。 FormData对象常用方法 FormData对象常用的方法有以下几种: append(name, value[, filename]): 在一个for…

    JavaScript 2023年5月27日
    00
  • nuxt中使用路由守卫的方法步骤

    下面是详细讲解”nuxt中使用路由守卫的方法步骤”的完整攻略。 什么是路由守卫? 路由守卫是用来监听路由跳转的钩子函数,我们可以在路由跳转过程中对路由做出一些拦截或者其他操作,比如登录校验、数据埋点等。 Nuxt中使用路由守卫的方法步骤 1. 在 nuxt.config.js 中配置路由 要使用路由守卫,必须先在 nuxt.config.js 中配置好路由,…

    JavaScript 2023年6月11日
    00
  • html中通过JS获取JSON数据并加载的方法

    获取JSON数据可以使用XMLHttpRequest对象或fetch API,以及jQuery库中的ajax方法。下面分别给出几个示例说明。 1. 使用XMLHttpRequest对象获取JSON数据并渲染 <!DOCTYPE html> <html> <head> <meta charset="UTF-8…

    JavaScript 2023年5月27日
    00
  • javascript实现图片左右滚动效果【可自动滚动,有左右按钮】

    下面是详细讲解“javascript实现图片左右滚动效果【可自动滚动,有左右按钮】”的完整攻略: 1. 确定HTML结构 首先需要确定HTML结构,一般来说,我们可以使用 ul 和 li 标签来实现一个图片轮播图。如下所示: <div class="container"> <ul class="img-list…

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