首页 > 其他分享 >闭包

闭包

时间:2024-04-26 15:13:41浏览次数:27  
标签:闭包 异步 createCounter 函数 作用域 变量

在JavaScript中,闭包是一个非常重要的概念,它指的是一个函数能够记住并访问它自身被创建时所在的作用域,即使它在别的地方被执行。

这是通过函数内部创建并返回另外一个函数来实现的。这个被返回的函数持有对外部函数作用域的引用,让这个函数可以访问到外部函数的变量。

来看一个简单的例子:

function createCounter() {
  let count = 0;
  return function() {
    return ++count;
  };
}

const counter = createCounter();

console.log(counter());  // 输出:1
console.log(counter());  // 输出:2

在这个例子中,createCounter函数返回了一个匿名函数,这个匿名函数引用并修改了createCounter函数作用域内的count变量。即使createCounter函数的执行上下文已经从调用栈中弹出,count变量仍然被匿名函数引用并可以对其进行操作,所以它没有被垃圾回收机制清除。

这就是一个典型的闭包:匿名函数能够“记住”它被创建时的环境。

闭包几乎在所有涉及到异步处理、回调函数以及在全局作用域以外保护变量不受污染的场合中都很有用。但是因为闭包会阻止垃圾回收机制回收被闭包引用的外部变量,所以过度使用闭包可能会导致内存暴涨,应注意适度。

闭包的作用:
闭包在JavaScript中有着多种重要作用:

  1. 数据封装和私有性:在许多面向对象的语言中,有"public"(公开的)和"private"(私有的)等概念,用于控制对属性和方法的访问权限。但在JavaScript中,并没有这样的内置机制。我们可以用闭包来模拟私有变量和方法,只暴露我们希望暴露的接口,而将实现细节隐藏在函数内部。

  2. 创建特定的函数:闭包可以用来创建配置了特定参数或状态的函数。以上面的创建计数器的例子来说,每次调用createCounter都会得到一个新的计数器,且各计数器彼此之间的计数是互不干扰的。

  3. 延迟计算和控制:闭包可以用来保存状态,使得函数在不同的时间点进行不同的处理。

  4. 控制异步操作:JavaScript的异步操作如计时器或AJAX请求通常牵涉到回调函数。在异步操作中,闭包可以帮助我们访问和控制函数外部的变量或状态,让我们能在将来正确地处理异步结果。

这些都是使用闭包可以带来的好处,但是也需要注意,闭包可能会造成内存泄露,正确使用闭包需要谨慎处理引用和生命周期,以便于垃圾回收机制能正常工作。

标签:闭包,异步,createCounter,函数,作用域,变量
From: https://www.cnblogs.com/byj666/p/18160136

相关文章

  • python闭包 - 理解与应用
    闭包定义闭包是指在一个函数内部定义的函数,并且这个内部函数可以访问外部函数的局部变量。当外部函数执行完毕后,内部函数仍然可以访问外部函数的局部变量,这种函数就称为闭包。在Python中,闭包通常用来保存一些状态信息,可以在外部函数执行完毕后继续使用这些状态信息。闭包可以帮......
  • js 闭包的概念及应用场景
    1.概念是内部函数可以访问外部函数作用域中的变量。2.来由由于JavaScript中的函数作用域规则和函数可以作为值传递的特性产生的3.优点封装性(可以将变量和函数封装起来,防止外部访问和修改,提高了代码的可维护性和可重用性)保存状态(即使函数已经执行完毕,状态仍然保存,在事件处理......
  • 面试题:如何理解闭包
    之前看的闭包讲解,都是一些示例,不太好作为面试题作答内部函数如果引用了外部函数的变量,会形成闭包。如果这个内部函数作为外部函数的返回值,就会形成词法环境的引用闭环(循环应用),对应的变量就会常驻在内存中,形成大家所说的“闭包内存泄漏”。虽然闭包有内存上的问题,但是却突破了......
  • 函数与闭包函数
    【一】函数对象Python中一切皆对象可以直接被引用定义一个函数用一个新的变量名来存,用新的变量名来调用可以作为元素被存储功能字典中的函数地址函数可以作为参数传递给另外一个函数将函数的内存地址作为参数传递函数的返回值可以是函数我们直接将函数的内存地址......
  • 10.函数对象 与 闭包函数
    【一】函数对象Python中一切皆对象可直接被引用定义一个函数,用一个新的变量名来存,来调用可作为元素被储存功能字典中函数的地址可作为参数传递给另一个函数将函数的内存地址作为参数函数的返回值可以是函数直接将函数的内存地址返回【二】闭包函数1)......
  • 函数对象、闭包函数
    【一】函数对象函数对象指的是函数可以被当做数据来处理,具体可以分为四个方面的使用【1】可以直接被引用定义一个函数用一个新的变量名来存,用新的变量名来调用#定义一个函数defadd(x,y):returnx+y#将函数地址绑定给一个变量func=add#通过这个变量找到......
  • 函数对象,闭包函数及装饰器了解
    函数对象【1】定义函数对象指的是函数可以被当做数据来处理【2】可以直接被引用定义一个函数用一个新的变量名来存,用新的变量名来调用#定义一个函数defadd(x,y):returnx+y#将函数地址绑定给一个变量func=add#通过这个变量找到对应的地址,从而调用函数res......
  • 什么是闭包陷阱?
    闭包陷阱通常是指在编程实践中,由于对闭包特性的误解或者不当使用所导致的一些常见问题和错误行为。闭包虽然功能强大,但如果不正确地处理它们,可能会遇到以下几个典型的陷阱:变量共享与持久化:当多个函数通过闭包共享同一外部变量时,可能会因为意料之外的数据共享而导致数据冲突......
  • js 逆向 闭包 查找变量
    https://s1.hdslb.com/bfs/static/history-record/app_84bedf69.js varl={ install:function(e,t){  functionn(){//目前断点在了这个函数要查找修改变量v的逻辑,发现v是属于install这个Closure作用域。然后,v肯定就在install这里边(绿色之间的部分)定义,往下......
  • python 闭包的理解
    目录一、什么是闭包?二、闭包的工作原理三、示例:创建一个简单的闭包四、闭包的用途五、闭包的应用场景1.数据封装和信息隐藏2.保持状态3.函数工厂4.延迟计算六、结论一、什么是闭包?  闭包是函数式编程的一种重要概念,在Python中也得到了支持。一个闭包......