广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >JS闭包到底是什么
  • 498
分享到

JS闭包到底是什么

2024-04-02 19:04:59 498人浏览 独家记忆
摘要

这篇文章主要讲解了“js闭包到底是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS闭包到底是什么”吧!  在javascript这

这篇文章主要讲解了“js闭包到底是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS闭包到底是什么”吧!

  

javascript这门语言中,闭包是它的核心基础之一,可以说是一个特色了,但是很多从事前端工作的程序员并没有真正的理解它!

闭包有多重要?如果你是初入前端的朋友,我可以肯定得告诉你,前端面试,必问闭包。面试官们常常用对闭包的了解程度来判定面试者的基础水平,保守估计,10个前端面试者,至少5个都死在闭包上。

通过本文讲解,希望你可以重新认识一下闭包!

函数调用时发生了什么?

为了理解闭包,首先我们需要完全理解 JavaScript 到底是如何工作的!

那么函数调用是会发生什么呢?

当浏览器在解析 JS代码的时候,会进行一个预解析的操作,会有一个js解析器,里面会执行其中的两步操作:

1、预解析,找一些东西(var function 参数);

2、逐行去解读代码。

当解析器解读函数调用时,会将整个函数执行一个入栈操作,并为函数创建一个新的执行上下文。函数内部可以看作是一个小的区域,它有它自己的作用域和执行线程,也要逐行解读。当函数显式返回(到达return语句)或隐式返回(默认情况下函数返回undefined)时,函数将出栈,其执行上下文也将被销毁。

闭包是什么鬼?

我们先来看下这段代码:

let name = "John"  function greet() {   const greeting = "Hi"    function printHi() {     console.log(greeting + ' ' + name)   }   printHi() }  name = "Jane"  greet() // "Hi Jane"

我们发现,子函数 printHi 可以访问全局作用域和其父函数 greet 的局部作用域。

注意,我们实际上可以访问函数执行期间可用的“新”数据,而不是声明。这就是词法作用域在 JavaScript 中的工作方式。

但是如果我们返回一个函数,而不是仅仅在外部函数体中调用它,会发生什么呢?

看好了,奇迹出现了!

从一个函数中返回的函数不仅仅是一个简单的函数定义,它是这个定义加上它可以访问并需要执行的变量,这些变量存储在它附带的词法作用域中。

我们刚刚描述的就是闭包。从形式上讲,闭包是一个「即使在词法范围之外调用,仍可以记住它的词法范围」的函数。

function creator(num) {   return function() {     num = num * 2     console.log(num)   } }  const double = creator(5) double() //10 double() //20  const double2 = creator(7) double2() // 14 double2() //28  double() // 40

正如我们在上面的代码片段中看到的,每当我们调用 double  时,它都会更新存储在其词法作用域中的同一个变量(来自其父函数的num),从技术上讲,这是函数所具有的隐藏 [[scope]] 属性。

如果你想知道闭包到底有什么用,请继续看下面的示例。

模块封装

闭包允许我们保护或隐藏某些信息。[[scope]]  是一个隐藏的属性,所以我们不能像使用标准对象那样访问和更新它。还有一点很重要,我们可以返回一组存储在对象上的函数,它们都是闭包。

在下面的代码片段中,我们利用了所谓的IIFE(立即执行函数),它允许我们消除调用外部函数的中间步骤,就像我们在赋值时直接调用它一样。

const myModule  = (function(){   const apiKey = "123456789"    return {     displayKey() {       console.log(apiKey)     }   }  })()  myModule.displayKey() // "123456789"

如果我们将这个模块 export 出去, 提供给其他人使用,我们为他准备的 API 不允许他更改  apiKey,这就做到了只读属性,除了在源代码中重写它之外,调用方不可能更改它。

缓存和记忆化

假设您想创建一个简单的ID生成器。为了确保总是返回比上一个高的数字,也可以使用闭包。我们将缓存当前变量中最高的 ID 值。

const newID = (function() {   let current = 0   return function() {     return ++current   } })()  newID() // 1 newID() // 2

当我们的算法时间复杂度很高时,这种缓存方式就非常有用,我们可以将部分结果存储在缓存中,当我们使用更高的数字进行计算时,我们可以使用缓存中的数据作为基础。这个过程叫做记忆化。一个最好的例子就是处理处理递归问题,比如斐波那契序列。

const factorialMemo = (function() {   const cache = {}   return function factorial(n) {     if(n === 1 || n === 0) {       return 1     } else if (cache[n]) {       return cache[n]     } else {       cache[n] = n * factorial(n-1)       return cache[n]     }   } })()   factorialMemo(5) //120 // cache object looks like {'2': 2, '3' : 6, '4' : 24, '5' : 120} factorialMemo(6) // 6 * cached 120

感谢各位的阅读,以上就是“JS闭包到底是什么”的内容了,经过本文的学习后,相信大家对JS闭包到底是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: JS闭包到底是什么

本文链接: https://www.lsjlt.com/news/73347.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JS闭包到底是什么
    这篇文章主要讲解了“JS闭包到底是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS闭包到底是什么”吧!  在JavaScript这...
    99+
    2022-10-19
  • Python打包缓存到底是什么?
    Python打包缓存到底是什么? Python是一种广泛使用的高级编程语言,其简单易用的特性受到了许多开发者的青睐。在Python开发过程中,打包和缓存是两个十分重要的概念。本文将详细介绍Python打包缓存的定义、作用、实现方法以及相关的...
    99+
    2023-08-27
    打包 缓存 编程算法
  • 闭包在js中是什么意思
    这篇文章跟大家分析一下“闭包在js中是什么意思”。内容详细易懂,对“闭包在js中是什么意思”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“闭包在js中是什么意思”的知识吧。什么是闭...
    99+
    2023-06-29
  • Go中闭包的底层原理是什么
    这篇文章将为大家详细讲解有关Go中闭包的底层原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 什么是闭包一个函数内引用了外部的局部变量,这种现象,就称之为闭包。例如下面的这段代码中,adder...
    99+
    2023-06-25
  • JS中为什么有闭包
    本篇内容主要讲解“JS中为什么有闭包”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS中为什么有闭包”吧!太长不看版当「函数访问在其外部定义的变量时」,你需要闭...
    99+
    2022-10-19
  • js中闭包有什么特点
    这篇文章给大家分享的是有关js中闭包有什么特点的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。闭包是js中的一大特色,也是一大难点。简单来说,所谓闭包就是说,一个函数能够访问其函数...
    99+
    2022-10-19
  • javascript到底是什么
    这篇文章主要介绍“javascript到底是什么”,在日常操作中,相信很多人在javascript到底是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”javascript...
    99+
    2022-10-19
  • MapStruct到底是什么?
    一、简介 现在的分布式系统中模块划分越来越细,不同模块的实体、DTO、DO等需要进行转换,这么多工程处理起来不是那么简单。 MapStruct 就是这样的一个属性映射插件,用于为Ja...
    99+
    2022-11-12
  • 到底什么是SSL
    本篇内容介绍了“到底什么是SSL”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  什么是SSL?  SSL是一种使用TCP / IP在两个通...
    99+
    2023-06-04
  • ViewState到底是什么
    ViewState是ASP.NET Web Forms中的一个重要概念,用于在Web服务器上存储和恢复页面的状态数据。在Web应用程...
    99+
    2023-09-01
    ViewState
  • 详细聊一聊js防抖节流到底是什么
    目录前言场景防抖核心解释修复场景例子节流核心解释修复场景例子总结前言 防抖和节流,这是前端防止用户频繁调用同一个接口的方法,比如短时间重复点击上传同一个文件,短时间重复点击提交同一个...
    99+
    2022-11-13
  • js闭包怎么用
    这篇文章主要为大家展示了“js闭包怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js闭包怎么用”这篇文章吧。首先引用来自官网文档的定义:closure i...
    99+
    2022-10-19
  • C++ set到底是什么
    目录1、set是什么2、set有什么用1、set是什么 如果大家学过几门编程语言,会发现各大语言的特性虽然迥异,但是总有几个东西反复出现刷存在感。它们在各个语言当中的名字虽然不太一样...
    99+
    2022-11-12
  • Live-USB到底是什么
    本篇文章给大家分享的是有关Live-USB到底是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我们平时所说的“U 盘”,正式名称是“USB闪存驱动器”(USB Flash ...
    99+
    2023-06-16
  • 详解JNI到底是什么
    目录一、前言二、准备java代码三、生成头文件四、gcc环境安装五、生成动态链接库六、总结一、前言 首先回顾一下jni的主要功能,从jdk1.1开始jni标准就成为了java平台的一...
    99+
    2022-11-12
  • HTML5到底是什么东西
    HTML,全称为“Hypertext Markup Language”,即超文本标记语言,是Web页面的构建语言。而HTML5,就是HTML的第五代规范,是目前最新的HTML规范。HTML5被认为是Web技术发展的重要里程碑,它的出现为We...
    99+
    2023-05-14
  • 什么是JavaScript闭包
    本篇内容主要讲解“什么是JavaScript闭包”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是JavaScript闭包”吧!什么是闭包简言之,闭包是由函数...
    99+
    2022-10-19
  • JavaScript闭包是什么
    这篇文章给大家分享的是有关JavaScript闭包是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概论在讨论ECMAScript闭包之前,先来介绍下函数式编程(与ECMA-2...
    99+
    2022-10-19
  • Scala闭包是什么
    这篇文章主要介绍“Scala闭包是什么”,在日常操作中,相信很多人在Scala闭包是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Scala闭包是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!闭包...
    99+
    2023-06-02
  • 云服务器到底是什么
    云服务器是一种虚拟的计算服务平台,用户可以通过互联网访问它来存储、管理和访问数据、应用程序和其他资源。云服务器通常包括许多功能,例如弹性存储、备份和恢复、负载均衡和安全管理等。 云服务器是一种高性能、可靠的计算服务,它可以提供高速、可靠的...
    99+
    2023-10-26
    到底是什么 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作