js闭包用法实例详解

JS闭包用法实例详解

什么是闭包?

闭包是指有权访问另一个函数作用域中变量的函数。创建闭包的常见方式是在一个函数内部创建另一个函数。在创建的内部函数中,可以访问外部函数的参数和变量,即使外部函数已经返回退出。

为什么要使用闭包?

闭包的主要作用是作为函数工厂,可以用来封装变量和方法,使全局变量不被污染。

同时,闭包可以让一个函数访问另一个函数的局部变量,使得这些变量的值即使在外部函数调用结束后仍然能被访问到。

闭包的使用场景

闭包最常见的使用场景是封装变量或函数。通过定义外部函数,在其内部定义内部函数,并在内部函数中引用外部函数定义的变量或函数,从而实现对外部函数变量或函数的保护控制。

例如:

function add() {
  var count = 0;
  function plus() {count += 1;}
  plus();
  return count;
}
add(); // 输出 1
add(); // 输出 1

在这个例子中,存储变量 count 的作用域被限制在 add() 函数内。 plus() 函数就是一个闭包,它可以访问 add() 函数内的变量 count。每一次执行 plus() 函数都会对 count 变量进行递增操作。因此,第一次执行 add() 函数时返回值为 1,第二次执行时返回值为 1,这说明内部变量 count 的值已经得到了保留,而闭包则对 count 变量的保护作用达到了目的。

闭包用法实例

实例1:计数器

function createCounter() {
  var counter = 0;
  function inner() {
    return ++counter;
  }
  return inner;
}

var getCount = createCounter();
console.log(getCount());  // 输出1
console.log(getCount());  // 输出2
console.log(getCount());  // 输出3

在这个例子中,createCounter 函数创建了一个闭包,并返回内部函数inner。内部变量 counter 被一直保留下来,并且每次调用 inner() 函数时,变量 counter 都会增加。这就实现了一个简单的计数器,每次调用 getCount() 函数都会返回递增的计数值。

实例2:缓存

function createCache() {
  var cache = {};
  function get(key) {
    return cache[key];
  }
  function set(key, value) {
    cache[key] = value;
  }
  return {
    get: get,
    set: set
  };
}

var cache = createCache();
cache.set('name', 'Jack');
cache.set('age', 20);
console.log(cache.get('name'));   // 输出 Jack
console.log(cache.get('age'));    // 输出 20
console.log(cache.get('gender')); // 输出 undefined

在这个例子中,createCache 函数同样创建了一个闭包,并返回了内部函数组成的对象。该对象包含了两个方法: get()set()get() 函数通过传入的 key 参数返回对应的缓存值; set() 函数则将 value 值存入 cache 对象的 key 属性中。

整个缓存过程的实现都在闭包内完成, cache 对象的作用域被限制在闭包内。由于闭包的保护作用, cache 对象不会被外部访问到,因此实现了一个简单的缓存框架。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js闭包用法实例详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • JS数组的遍历方式for循环与for…in

    JS数组是常用的数据类型之一,数组中存放着一系列的元素,我们通过数组索引来访问这些元素。JS数组的遍历方式有许多,其中包括for循环和for…in两种方式。 for循环 for循环是JS中最常用的循环语句,用于对数组的元素进行遍历操作。for循环的语法格式如下: for (let i = 0; i < arr.length; i++) { // d…

    JavaScript 2023年5月27日
    00
  • php cookie用户登录的详解及实例代码

    现在我来给您详细讲解“php cookie用户登录的详解及实例代码”的完整攻略。 概述 在网站开发中,登录是一个非常重要的功能。其中,保存用户登录状态的方式有多种,其中之一就是通过使用cookie来保存用户信息。本文将通过示例代码,详细讲解如何使用php cookie来实现用户登录。 实现步骤 步骤一:创建登录页面 首先,我们需要在HTML中创建一个登录页面…

    JavaScript 2023年6月11日
    00
  • JavaScript中async await更优雅的错误处理方式

    关于JavaScript中async/await更优雅的错误处理方式,以下是完整的攻略: 1. 异步函数 在使用async/await模式的时候,需要将异步操作封装到一个函数中,在函数前面声明async,使其变成一个异步函数,如下所示: async function fetchData() { const response = await fetch(‘/a…

    JavaScript 2023年5月18日
    00
  • JavaScript中的内存泄漏的原因

    JavaScript内存泄漏的原因 什么是内存泄漏? 内存泄漏指的是在程序中,某一个对象在不再被使用时,仍然被占用了内存空间,导致内存空间的浪费问题。如果出现内存泄漏,会导致应用程序变得越来越慢,最终可能导致程序崩溃。 JavaScript中的内存泄漏非常难以发现,因为它不会在内存使用率上直接显示出来。下面是Javascript中的内存泄漏的原因及解决方案。…

    JavaScript 2023年6月10日
    00
  • jQuery ajax(复习)—Baidu ajax request分离版

    下面是 “jQuery ajax(复习)—Baidu ajax request分离版”的完整攻略。 简介 本篇攻略主要介绍如何使用jQuery发起Ajax请求,以及如何使用Baidu Ajax Request分离版优化你的Ajax请求。 Ajax基础 什么是Ajax? Ajax全称是 Asynchronous JavaScript and XML(异步的 J…

    JavaScript 2023年6月11日
    00
  • vue组件中实现嵌套子组件案例

    Vue组件是实现可重用性和封装性的关键,并且Vue允许您嵌套组件和在组件中使用子组件。下面是实现嵌套子组件的完整攻略: 创建子组件 首先,需要创建子组件,通常是通过定义一个Vue组件,在template代码块中编写HTML模板,以及在script代码块中编写相关的逻辑代码。 下面是一个示例子组件的代码: <template> <div&gt…

    JavaScript 2023年6月11日
    00
  • 小程序实现计时器功能

    下面是“小程序实现计时器功能”的完整攻略: 1. 准备工作 在开始编写计时器功能之前,需要先创建一个小程序项目,并在页面中引入 wx.createInnerAudioContext() 实现计时结束后的声音提示。 2. 计时器实现 2.1 变量定义和初始值设置 首先,需要在 data 中定义计时器相关的变量,例如当前计时器的状态、计时器显示的时间等: dat…

    JavaScript 2023年6月11日
    00
  • JavaScript代码不能被阻断的稳定性建设

    JavaScript 代码不能被阻断是指,无论代码执行的过程中是否发生运行时错误,代码都不能停止或崩溃。这在编写稳定、高效的 JavaScript 应用程序时非常重要。为了实现 JavaScript 代码不能被阻断的稳定性建设,以下是一些建议和示例。 1. 异常处理 在 JavaScript 中,处理异常是非常重要的。如果存在未处理的异常,它将导致程序终止并…

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