首页 > 编程语言 >JavaScript 中的 闭包

JavaScript 中的 闭包

时间:2024-08-20 16:39:59浏览次数:8  
标签:闭包 const 函数 示例 JavaScript add addTo2

闭包

在 JavaScript 中,你可以在其他函数内部声明并返回函数。内部函数可以访问在其上方声明的任何变量。

function createAdder(a) {
  return function add(b) {
    const sum = a + b;
    return sum;
  }
}
const addTo2 = createAdder(2);
addTo2(5) // 7
addTo2(0) // 2

内部函数 add 可以访问 a。这允许了外部函数充当新函数的工厂,每个函数都具有不同的行为。

闭包 VS 类

在上面的示例中,createAdder 非常类似于类构造函数。

class Adder {
  constructor(a) {
     this.a = a;
  }

  add(b) {
    const sum = this.a + b;
    return sum;
  }
}
const addTo2 = new Adder(2);
addTo2.add(5); // 7

除了语法上的差异之外,这两个示例在本质上具有相同的目的。它们都允许你在「构造函数(Constructor)」中传递一些状态,并具有可以访问此状态的「方法 (Method)」。

它们之间一个关键的区别是闭包允许真正的 封装。在类的示例中,没有任何限制阻止你编写 addTo2.a = 3; 并破坏其预期行为。然而,在闭包的示例中,理论上无法访问 a

另一个区别是函数在内存中的存储方式

  • 如果创建了许多类的实例,每个实例都存储对 原型对象 的单一引用,其中都存储了所有「方法(Method)」
  • 而对于闭包,所有「方法(Method)」都在每次调用外部函数时生成并存储了一个「副本(Copy)」

因此,在同时有多种方法可用的情况下,类可以在性能方面体现更高的效率。

标签:闭包,const,函数,示例,JavaScript,add,addTo2
From: https://www.cnblogs.com/xxaxf/p/18369730

相关文章

  • [Javascript] HTML Template Interpolation
    Thebasic interpolatefunctionwecancreate:functioninterpolate(str,params){letnames=Object.keys(params);//["title","description"]letvalues=Object.values(params);//["Hello","World"]......
  • JavaScript-正则表达式入门指南-全-
    JavaScript正则表达式入门指南(全)原文:IntroducingRegularExpressions协议:CCBY-NC-SA4.0一、正则表达式简介为了开始介绍正则表达式,我将从一个例子开始。这是一个你已经经历了几百次的问题。当您在线输入客户数据时,许多web表单会要求您提供电子邮件地址。为了避免输入......
  • JavaScript-快速语法参考-全-
    JavaScript快速语法参考(全)原文:JavaScriptQuickSyntaxReference协议:CCBY-NC-SA4.0一、使用JavaScript要开始试验JavaScript,您应该安装一个支持这种语言的集成开发环境(IDE)。有很多不错的选择,比如NetBeans、Eclipse、VisualStudio、括号。在本书中,我们将使用NetBe......
  • JavaScript-入门指南-全-
    JavaScript入门指南(全)原文:BeginningJavaScript协议:CCBY-NC-SA4.0一、JavaScript简介这些年来,avaScript发生了很大变化。我们目前正处于一个JavaScript库的时代,你可以构建任何你想构建的东西。JavaScript存在于客户机和服务器上,存在于桌面和移动设备上。这本书的目......
  • JavaScript ES6 Map
    Map对象保存键值对。任何值(对象或者原始值)都可以作为一个键或一个值。Maps和Objects的区别一个Object的键只能是字符串或者Symbols,但一个Map的键可以是任意值。Map中的键值是有序的(FIFO原则),而添加到对象中的键则不是。Map的键值对个数可以从size属性获......
  • JavaScript函数调用之多括号调用(精讲)
    目录fn()()调用形式fn1().fn2()调用形式也叫链式调用链式调用的特点常见用途(fn())()调用形式也叫立即调用函数(IIFE)关键点:用途:示例:几种多括号调用形式:fn()()()fn1().fn2()(fn())()fn()()调用形式定义:是一个JavaScript中常见的模式,通常用于函数式编程。它的......
  • 《提升前端性能的 JavaScript 技巧》
    在前端开发中,性能优化是至关重要的一环。JavaScript作为前端开发的核心语言,掌握一些关键的技巧可以显著提升应用的性能。本文将为您介绍一些实用的JavaScript技巧,帮助您优化前端性能。一、避免不必要的计算在代码中,尽量避免在频繁执行的代码块中进行复杂且不必要的计算。......
  • 别再被坑了! JavaScript类型检测的最佳实践
    别再被坑了!JavaScript类型检测的最佳实践在JavaScript中,我们经常需要判断一个变量的类型。这个需求在编程中非常常见,因为不同类型的数据会影响到我们的代码逻辑。JavaScript提供了几种方法来检测数据类型,每种方法都有自己的优缺点。Object.prototype.toString.call()......
  • JavaScript判断系统和浏览器
    在做项目的时候,Web端需要适配移动端,且部分参数需要判断对应系统或浏览器。在IOS中,因为高版本的系统Safari浏览器采用了Mac的内核,所以导致普通的判断无法识别到对应系统。(userAgent.match(/(Macintosh)/)&&navigator.maxTouchPoints>=1)能有效识别是apple端,且是触屏的,通过......
  • 0-JavaScript入门
    1.1JS用途JavaScript属于一门脚本语言,可用于前端给网页添加一些动态效果。也可用于node平台,开发服务器React、Vue框架底层也是通过JS实现1.2JS组成前端分为三层层次用途HTML(结构层)利用语义化标签搭建网页CSS(样式层)利用样式进行美化网页、进行网页布局J......