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

yizhihongxing

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日

相关文章

  • 微信小程序开发探究

    微信小程序开发探究 微信小程序是一种全新的开发模式,可以实现在微信中快速开发小型应用。本文旨在为开发者提供一份完整的微信小程序开发攻略,涵盖从创建应用、开发基本组件到调用API等方面的内容。 创建应用 要创建一个微信小程序,需要进行以下步骤: 下载并安装微信开发者工具; 在工具中,选择“新建小程序”; 填写小程序的基本信息,并选择开发模式; 进入开发者工具的…

    JavaScript 2023年6月11日
    00
  • javascript实现用户点击数量统计

    针对“javascript实现用户点击数量统计”,给出详细的攻略如下: 1. 在HTML中使用JavaScript实现点击数统计 步骤1:在HTML中定义一个计数器 首先,在你的HTML文件中定义一个计数器,可以使用一个全局变量来存储它,例如: var count = 0; 这个计数器用来记录用户点击了多少次按钮。 步骤2:在HTML中添加一个按钮 然后,在…

    JavaScript 2023年6月11日
    00
  • 基于JavaScript定位当前的地理位置

    下面是“基于JavaScript定位当前的地理位置”的完整攻略。 一、前提准备 在开始定位当前的地理位置之前,需要完成以下几个前提准备: 获取用户的位置需要用户授权,所以需要在web应用程序中使用HTML5的Geolocation API,而Geolocation只支持在HTTPS或者本地host环境下使用,所以需要对应用进行HTTPS协议的开发或者本地开发…

    JavaScript 2023年6月11日
    00
  • 18个高频使用的JS工具方法总结

    标题:18个高频使用的JS工具方法总结 – 完整攻略 正文: 背景介绍 作为开发人员,经常需要使用一些常用工具方法来处理各种问题,这些工具方法可以节省开发时间、提高代码效率。本文总结了18个高频使用的JS工具方法,并对每个工具方法进行详细说明,包括使用方法、参数说明及返回值等内容。本文旨在为大家提供一份可供参考的JS工具方法总结,让大家能够更加高效地完成开发…

    JavaScript 2023年6月10日
    00
  • JavaScript运动函数实例详解

    JavaScript运动函数实例详解 运动函数是实现网页动画效果的必备工具之一,JavaScript中有多种运动函数实现方式,其中以JavaScript的定时器方式实现最为常见。本文将详细讲解使用JavaScript定时器实现运动函数的方法,同时给出两个示例说明。 定时器 JavaScript中用于实现定时器的函数是setInterval()和setTime…

    JavaScript 2023年5月27日
    00
  • js Object2String方便查看js对象内容

    这里是关于如何使用 JavaScript 的 Object2String 来方便查看 JavaScript 对象内容的详细攻略: 安装: Object2String 是当下比较常用的一个 npm 模块,并且可以通过命令行快速安装: npm install obj2str 用法: 在代码中,我们可以使用 require 或者 import 的方式引入 obj2…

    JavaScript 2023年5月27日
    00
  • 通过javascript的匿名函数来分析几段简单有趣的代码

    请看下面的攻略: 1. 什么是匿名函数? 匿名函数是指没有名称的函数,它被定义时直接赋值给一个变量或者作为参数传递给其他函数。匿名函数定义的语法格式如下: var fn = function () { // 函数体 } 其中,fn是变量名,function () {}是函数体,它可以包含任意的 JavaScript 代码和语句。 2. 分析简单有趣的代码 我…

    JavaScript 2023年5月28日
    00
  • JS中图片缓冲loading技术的实例代码

    下面我将详细讲解JS中图片缓冲loading技术的实例代码攻略。 1. 图片缓冲loading技术的作用 图片缓冲loading技术可以解决图片加载过慢或者图片尚未加载完成时页面出现的空白或错乱现象,使得页面更加优雅和美观。 2. 实现步骤 2.1 定义图片缓存对象 首先,我们需要定义一个空对象,用于保存本页面中所需加载的所有图片资源。 let imgObj…

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