首页 > 其他分享 >闭包closure

闭包closure

时间:2024-09-05 21:46:55浏览次数:6  
标签:闭包 closure aa 函数 作用域 function 变量

先理解:作用域、作用域链、函数作用域以及变量对象
.
.
给一段代码:

    var global;
    function a() {
        var aa = 123
        function b() {
            aa = 111
            console.log(aa)
        }
        // b()
        return b
    }
    var res = a()
    res()

本来fn a执行完后应该销毁,即作用域链断裂。但是它里面return了一个b,b的作用域链并未断裂,b在定义时,它的作用域链中是可以访问到fn a内的变量的。
此时的a函数调用和b函数生成是同一个作用域链

.

.

.
那么如何定义闭包?

闭包(Closure)可以精简凝练地定义为:一个函数以及创建该函数时所能访问的所有外部变量的组合。闭包允许一个函数访问并操作函数外部的变量,即使该函数在其外部作用域之外被调用。这种机制使得JavaScript等语言能够支持私有变量和模块化编程。

简单来说,闭包就是能够记住并访问其词法作用域(lexical scope)的函数,即使该函数在其词法作用域之外执行。

也就是说,能够读取其他函数内部变量的函数就是闭包
.
.
.
.
场景适用:

  1. 定时器传参
// 定时器传参
    function a(aa) {
        return function () {
            console.log(aa)
        }
    }

    setTimeout(() => {
        const logFunc = a(123)
        logFunc()
    }, 1000)

闭包是一个函数值,它引用了其外部作用域中的变量。在这个例子中,a函数返回的匿名函数就形成了一个闭包,因为它引用了在a函数作用域中定义的aa变量。
.
要理解,尽管a函数的执行和logFunc变量的赋值都发生在setTimeout的回调函数中,但是闭包内的aa变量仍然能够保持其值(123),并且可以被闭包内部的代码访问。这是因为闭包记住了它被创建时的作用域环境。

标签:闭包,closure,aa,函数,作用域,function,变量
From: https://www.cnblogs.com/mandyGuan12/p/18399280

相关文章

  • python_August(闭包、装饰器)
    目录闭包函数装饰器登录装饰器闭包函数列如一个简单爬虫,这里的request需要从第三方库导入#importrequests ##pipinstallrequest#response=requests.get('http://www.xiaohuar.com/')#response.encoding='gb2312' ##解码方式#data=response.text ###文本#pr......
  • 闭包的含义
    目录闭包的含义闭包的含义在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包闭包可以用来在一个函数与一组"私有"变量之间创建关联关系.在给定函数被多次调用的过程中,这些私有变量能够保持其持久性.这种叫做嵌套函数de......
  • python回调函数,闭包,派生
    回调函数:传入函数名称,在函数内调用该函数,传参,在特定的地方执行defsum(a,b,callback):  c=a+b  callback(c)defs_print(msg):  print("callback:%s"%msg)defs_print2(msg):  print("callback2:%s"%msg)sum(1,3,s_print2) 闭包:defouter_fu......
  • JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南
    目录闭包的各种实践场景:高级技巧与实用指南一、什么是闭包?1、闭包的基本概念2、闭包的工作原理3、闭包的用途二、闭包的实际应用场景1、模拟私有变量2、事件处理和回调函数3、延迟函数和异步操作4、柯里化5、备忘录模式(Memoization)三、闭包的性能问题1、内存泄漏......
  • JavaScript - 闭包
    使用场景数据封装闭包允许创建私有变量,这些变量在函数外部无法直接访问。通过闭包,可以创建具有私有状态的对象,从而实现数据封装。例如:functioncreateCounter(){letcount=0;//count是私有变量returnfunction(){count++;returncount;};}const......
  • Javascript里的闭包
    闭包闭包,允许函数访问创建时的作用域中的变量,即使该函数在其原始作用域之外被执行。这使得闭包非常适合用于封装私有变量和创建具有特定状态的函数。Javascript里的闭包functioncreateCounter(){letcount=0;//计数器的私有变量return{increment:f......
  • 28:函数闭包与装饰器
    l=[1,3]l.__iter__()#迭代器#装饰器:本质就是函数,功能是为其他函数添加附加功能#原则:#1.不修改被修饰函数的源代码#2.不修改被修饰函数的调用方式#装饰器的知识储备#装饰器=高阶函数+函数嵌套+闭包#adefcal(l):res=0foriinl:res+=ireturnr......
  • JS函数和闭包函数详解
    JS函数和闭包函数引言简要介绍主题在前端开发中,JavaScript函数是不可或缺的一部分。函数是JavaScript中的基本构建块,用于封装代码以实现模块化和可重用性。闭包函数则是JavaScript中的高级概念,它允许函数访问其词法作用域中的变量,即使在函数执行完毕之后。本文将详细介......
  • JavaScript 中的 闭包
    闭包在JavaScript中,你可以在其他函数内部声明并返回函数。内部函数可以访问在其上方声明的任何变量。functioncreateAdder(a){returnfunctionadd(b){constsum=a+b;returnsum;}}constaddTo2=createAdder(2);addTo2(5)//7addTo2(0)//2......
  • size of rust closure
    principlehttps://doc.rust-lang.org/reference/types/closure.html?highlight=fnonce#closure-typesdemo1fnf<F:FnOnce()->String>(g:F){println!("{}",std::mem::size_of::<F>());println!("{}",g());}fnm......