首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么闭包中的自由变量值在被直接访问时只返回初始值?

闭包中的自由变量值在被直接访问时只返回初始值,是因为闭包的特性导致的。

闭包是指一个函数可以访问并操作其外部函数中定义的变量,即使在外部函数执行完毕后,闭包仍然可以访问这些变量。在JavaScript中,闭包是通过函数嵌套函数来实现的。

当一个函数内部定义了一个函数,并且内部函数引用了外部函数的变量时,就形成了闭包。内部函数可以访问外部函数的变量,而外部函数的变量对于内部函数来说就是自由变量。

在闭包中,当内部函数引用了外部函数的变量时,实际上是通过引用的方式访问这些变量。而在JavaScript中,变量的引用是按值传递的,而不是按引用传递的。这意味着内部函数实际上持有的是外部函数变量的一个副本,而不是直接引用外部函数的变量。

当外部函数执行完毕后,其作用域中的变量会被销毁,但由于内部函数持有外部函数变量的副本,所以这些变量的值仍然可以被内部函数访问。但是,由于内部函数持有的是变量的副本,而不是变量本身,所以当直接访问这些变量时,只能获取到它们的初始值,而不是最新的值。

这就是为什么闭包中的自由变量值在被直接访问时只返回初始值的原因。

闭包在实际开发中有很多应用场景,例如可以用于实现私有变量、模块化开发、缓存等。在前端开发中,闭包常用于解决异步回调函数中的作用域问题。

腾讯云相关产品和产品介绍链接地址:

  • 云函数(Serverless):https://cloud.tencent.com/product/scf
  • 云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 云存储(对象存储):https://cloud.tencent.com/product/cos
  • 人工智能平台(AI Lab):https://cloud.tencent.com/product/ai
  • 物联网开发平台(物联网套件):https://cloud.tencent.com/product/iotexplorer
  • 移动开发平台(移动推送):https://cloud.tencent.com/product/umeng_push
  • 区块链服务(腾讯区块链 BaaS):https://cloud.tencent.com/product/baas
  • 元宇宙平台(腾讯元宇宙):https://cloud.tencent.com/product/tencent_metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Go 编程 | 连载 24 - Closure

是引用了自由变量 匿名函数,被引用自由变量和函数一同存在,即使已经离开了自由变量环境也不会释放或者删除,在可以继续使用这个变量,也就是说就等于 函数+引用环境。...被捕获到比变量让函数本身有了 “记忆”,逻辑可以修改捕获变量值,变量就会跟随声明周期一直存在,本身就如同变量一样有了 “记忆”。...,但其实是指向同一块内存,会在运行时动态修改变量值。...GenScore 返回值将 name 和 score 两个变量引入匿名函数,从而形成。...还具有一定封装性,函数外部无法直接访问修改这些匿名函数引用变量,这与面向对象封装特性相似。

31210

《JavaScript函数式编程》读后总结一

在JS,函数是一等公民。这该怎么理解?为什么说它是“一等”呢?其实这体现在函数可以去任何值可以去地方,很少有限制。...没错,还记得应用场景么?函数作为返回值 和 函数作为参数传递。再进一步回忆下,函数自由变量取值自哪里?自由变量值从函数创建所处作用域中取得,划重点是创建,而非调用时。...就是一个普通函数,在该函数生成时会“捕获”附近值。这个“附近”指的是该函数创建所处作用域,这个值就是函数自由变量值。...组织一下语言表述:就是一个函数,与普通函数区别在于,它能捕获自身创建所处作用哉值作为自己作用哉内自由变量值,这个捕获值可以是任何类型,包括函数,并且该函数在其他作用域中被调用时,仍然能保持对该自由变量值引用...类比捕获一个其创建所处作用域中变量以供其使用,即使该变量所处作用域在程序执行下去已经销毁,但该变量值由于仍始终被引用,所以系统回收机制会始终视而不见让它一直活着,直到这个包被主动销毁

40110
  • python生产实战 python 之庖丁解牛篇

    1.1 计算机 在计算机科学(Closure)是词法(Lexical Closure)简称,是引用了自由变量函数。...使用场景是很丰富,我简单举几个例子: 因为只有在被调用时才执行操作,所以它可以被用来定义控制结构。...3 C/C++ 思想 3.1 C 类似结构 在 C 语言中,支持回调函数库有时在注册需要两个参数:一个函数指针,一个独立 void*指针用以保存用户数据。...C++标准委员会正在考虑两种在 C++引入建议(它们都称为 lambda 函数)。这些建议间主要区别在于一种默认在中储存全部局部变量拷贝,而另一种存储这些变量引用。...对于字典以及数组这类可变类型,是可以对自由变量值做出改变

    55230

    java匿名内部类变量要使用final原因(转载)

    - RednaxelaFX 回答 为什么Java不能通过返回值之外方式向外传递值? - RednaxelaFX 回答 1....(Closure) 什么是,大白话不怎么严谨说就是: 一个依赖于外部环境自由变量函数 这个函数能够访问外部环境里自由变量 看下面这个Javascript例子: 对内部函数function...>λx.λy.x+y 但在Java我们看不到这样结构。因为Java主流语法不允许这样直接函数套嵌和跨域访问变量。 2. 类和对象 但Java真的不存在吗?...内部类(Inner Class)通过包含一个指向外部类引用,做到自 由访问外部环境类所有字段,变相把环境自由变量封装到函数里,形成一个。 4....其他和匿名内部类相似的结构 《Think in Java》书里,点出了匿名内部类来自外部环境自由变量必须是final。但实际上,其他几种不太常用内部类形式,也都有这个特性。

    1.3K00

    解释JavaScript

    每次函数f被调用后,一个新函数g被创建,(函数g)局部于函数f执行过程。当函数g被返回,我们可以把它赋值给一个全局变量。...(题外话,使用函数定义去定义‘函数g’,接着返回函数g,并不是必需。我们可以使用函数表达式作为替代,函数表达式允许我们创建函数不用命名函数。也就是直接返回匿名函数。...当函数g被调用时,函数g可以访问那个形参x,这并没有什么奇怪。令人惊讶地方在于,当你从函数f返回函数g后,返回函数g在被调用时仍然可以访问你传递参数5(就像原先那个例子展示那样)。...让人迷惑地方在于:函数g被返回后,仍然记得在函数f被调用时被定义变量x(这也是大家理解,有困惑地方)。从这点来说,确实不能理解。...现在getDave被调用,它返回了’Bob‘。所以getDave和setDave这两个函数记得同一个变量。这也就是我想表达含义:’是保留它们自由变量一份引用函数‘。

    93220

    go 学习笔记之10 分钟简要理解 go 语言技术

    ,实现斐波那契数列生成器函数逻辑不变,只是实现不同,返回是内部函数,留给使用者继续调用而普通函数是直接生成斐波那契数列. // 1 1 2 3 5 8 13 21 34 55 func TestFibonacci...自带独立运行环境,每一次运行环境都是相互独立,正如面向对象类和对象实例化关系那样,是类,引用是实例化对象. func autoIncrease() func() int {...,那么内部引用自由变量就不会被销毁,一直处于活跃状态,从而获得永生超能力!...祸兮福所倚福兮祸所伏 凡事有利必有弊,不死则引用变量不灭,如果不理解变量长生不老特性,编写函数可能一不小心就掉进作用域陷阱了,千万要小心!...[go-functional-programming-closure-wrong.png] 原因仍然是变量长生不老特性:遍历循环绑定变量值肯定是 1,2,3,但是循环变量 i 却没有像普通函数那样消亡而是一直长生不老

    45110

    Go 语言基础入门教程 —— 函数篇:匿名函数和

    概念和价值 所谓指的是引用了自由变量(未绑定到特定对象变量,通常在匿名函数外定义)函数,被引用自由变量将和这个函数一同存在,即使已经离开了创造它上下文环境也不会被释放(比如传递到其他函数或对象...支持多数语言都将函数作为第一类对象(firt-class object,有的地方也译作第一级对象,第一类公民等),就是说这些函数可以存储到变量作为参数传递给其他函数,能够被函数动态创建和返回。...Go 语言中应用场景 Go 语言中同样也会引用函数外定义变量,只要在被使用,那么被引用变量会一直存在。 下面我们来看一下 Go 语言中几个应用示例。...外部函数传入了匿名函数 add作为参数,add 函数在外部函数执行,虽然作用域离开了 main 函数,但是还是可以访问到变量 i。...我们声明 addfunc 函数返回值是一个函数,并且在 return 返回一个,这个可以访问外部函数参数和变量,并持有这些变量,只要存在,这些变量就一直存在,即使脱离了 addfunc

    1.1K10

    Laravel源码解析之中间件

    Laravel通过Pipeline(管道)对象来传输请求对象,在Pipeline请求对象依次通过Http Kernel里定义中间件前置操作到达控制器某个action或者直接处理得到响应对象。...getInitialSlice方法,他返回值是作为传递给callbakc函数$carry参数初始值,这个值现在是一个,我把getInitialSlice和Http KerneldispatchToRouter...getSlice会返回一个函数, $stack在第一次调用getSlice值是$firstSlice, 之后调用中就它值就是这里返回值个包了: $stack = function ($...$stack传递给下一次对callback调用,arrayreduce执行完成后就会返回一个嵌套了多层,每层用到外部变量$stack都是上一次之前执行reduce返回,相当于把中间件通过包层层包裹包成了一个洋葱...通过剥洋葱过程我们就能知道为什么在array_reduce之前要先对middleware数组进行反转, 因为包装是一个反向过程, 数组$pipes第一个中间件会作为第一次reduce执行结果被包装在洋葱最内层

    1.4K30

    Swift学习:属性

    (let)或变量(var),作为实例一部分; 计算型属性:计算属性不直接存储值,而是提供一个getter和一个可选setter,来间接设置其他属性或变量值; 下面通过一段代码演示这两种属性区别:...延迟属性作用:当属性值依赖于在实例构造过程结束后才会知道影响值外部因素,或者当获得属性初始值需要复杂或大量计算,可以在需要时候计算它。...1.3.计算属性使用 计算属性不直接存储值,而是提供一个getter和一个可选setter,来间接设置其他属性或变量值;总结它使用特点如下: 1.只有getter没有setter计算属性就是只读计算属性...只读属性通过点运算符访问,只能返回值而不可设置新值; 2.计算属性与其他属性相关,是变化,所以必须使用var关键字进行修饰,包括只读计算属性; 3.只读计算属性可以去掉get关键字和花括号; struct...、方法、或者任意类型之外定义变量 局部变量:在函数、方法或者内部定义变量 全局常量或变量都是延迟计算,跟延迟存储属性相似,不同地方在于:全局常量或变量不需要标记lazy修饰符。

    62620

    详解 final 修饰符

    ,如果定义该final变量就指定初始值,而且这个初始值可以在编译就确定下来(比如2、4.3、"HELLO WORLD"这样直接量),那么这个final变量将不再是一个变量,而是把它当成一个"宏变量...如果父类和子类没有在同一个包下,父类定义方法没有使用权限控制符修饰,那子类也无法重写该方法: ? ? 3. 为什么匿名内部类访问局部变量必须使用final修饰?...要解释这个原因,首先需要了解两个概念:(closure)和回调(call-back) 是一种能被调用对象,它保存了创建它作用域信息,Java7没有显式支持,但对于非静态内部类而言,他不仅记录了其外部类详细信息...,还保留了一个创建非静态内部类对象引用,并且可以直接调用外部类private成员,因此可以把非静态内部类当场面向对象领域 通过这种仿非静态内部类,可以很方便实现回调功能,回调就是某个方法一旦获得了内部类对象引用后...非静态内部类对象可以很方便回调其外部类Field和方法,所以非静态内部类与""功能是一样 接下来继续解释为什么匿名内部类访问局部变量必须使用final修饰 对于普通局部变量而言,它作用域就是停留在方法内

    50940

    JavaScript 进阶 - 第1天

    函数作用域 在函数内部声明变量只能在函数内部被访问,外部无法直接访问。...相同作用域链按着从小到大规则查找变量 子作用域能够访问父作用域,父级作用域无法访问子级作用域(就近原则) 1.4 是一种比较特殊和函数,使用能够访问函数作用域中变量。...foo(); fn(); // 1 总结: :一个作用域有权访问另外一个作用域局部变量, 好处:可以把一个变量使用范围延伸 本质仍是函数,不是从函数内部返回...能够创建外部可访问隔离作用域,避免全局变量污染 过度使用可能造成内存泄漏 注:回调函数也能访问函数内部局部变量。...{} 用于批量声明变量,右侧对象属性值将被赋值给左侧变量 对象属性值将被赋值给与属性名相同变量 对象找不到与变量名一致属性变量值为 undefined 允许初始化变量默认值,属性不存在或单元值为

    80020

    深入剖析 JavaScript

    ❝一个函数和对其周围状态引用捆绑在一起,这样组合就是「」. 通俗说:一个内层函数可以访问外层函数作用域 就叫 「」。...在 JavaScript ,每当创建一个函数,就会在函数创建同时被创建出来。 形成与变量作用域以及变量生命周期密切相关。...❞ 函数作用域 ❝函数作用域:在函数内部可以访问到函数外部变量,而在函数外部变量不可以访问函数内部变量。 为什么呢?...现在无论点击哪个 div ,它 弹出 都是 4 。 为什么呢? 「因为 div 点击事件 是被 异步触发,当事件被触发时候,循环已经执行完,此时 i 变量值 为 4。」...第三次 执行 a() , 因为num 已存在内存,而值为1 最终输出结果:0 , 1 ❞ 注意 ❝ 由于会使得函数变量都被保存在内存,内存消耗很大,所以不能滥用,否则会造成网页性能问题

    27230

    🌞 深入剖析 JavaScript

    通俗说: 一个内层函数可以访问外层函数作用域 就叫 。 在 JavaScript ,每当创建一个函数,就会在函数创建同时被创建出来。...函数作用域 函数作用域: 在函数内部可以访问到函数外部变量,而在函数外部变量不可以访问函数内部变量。 为什么呢?...现在无论点击哪个 div ,它 弹出 都是 4 。 为什么呢? 因为 div 点击事件 是被 异步触发,当事件被触发时候,循环已经执行完,此时 i 变量值 为 4。...执行addNum 访问 f2() 函数内部局部变量 num , 此时,addNum 存在依赖于 f2,因此f2 也在内存,不会在调用结束后,被垃圾回收机制(garbage collection...第三此 执行 a() , 因为num 已存在内存,而至值为1 最终输出结果: 0 , 1 注意 由于会使得函数变量都被保存在内存,内存消耗很大,所以不能滥用,否则会造成网页性能问题

    38420

    go 学习笔记之仅仅需要一个示例就能讲清楚什么

    : 环境是一种映射,它将函数每个自由变量(在本地使用但在封闭范围内定义变量)与创建名称绑定到值或引用相关联。...「雪之梦技术驿站」: 由于函数内部使用了自由变量,所以内部也就关联了自由变量值或引用,这种绑定关系是创建确定,运行时环境也会一直存在并不会发生像普通函数那样无法维持环境....怎么理解 是一种函数式编程实现名称绑定技术,直观表现为函数嵌套提升变量作用范围,使得原本寿命短暂局部变量获得长生不死能力,只要被捕获到自由变量一直在使用,系统就不会回收内存空间!...不是某一种语言特有的机制,但常出现在函数式编程,尤其是函数占据重要地位编程语言. 直观表现是函数内部嵌套了函数,并且内部函数访问了外部变量,从而使得自由变量获得延长寿命能力....中使用自由变量一般有值传递和引用传递两种形式,示例斐波那契数列生成器利用是引用而循环变量示例用是值传递. Go 不支持函数嵌套但支持匿名函数,语法层面的差异性掩盖不了整体统一性.

    44610

    python函数嵌套、函数作为变量以及原理

    理解:在inner函数,python解析器需要找一个叫name本地变量,查找失败后会继续在上层作用域里面寻找,这个上层作用域定义在outer函数里,python函数可以访问封闭作用域。...也就是说你可以把函数像参数一样传递给其他函数或者说从函数了里面返回函数return内层函数不加括号,返回函数地址:代码:#encoding=utf-8def outer(): name="...例,inner作为一个函数被outer返回,保存在变量res,并且还能够调用res()。为什么能调用呢?...上例inner()函数就是一个,它本身也是一个函数,而且还可以访问本身之外变量。...:一个函数返回函数对象,这个函数对象执行的话依赖非函数内部变量值,这个时候,函数返回实际内容如下: 1 函数对象 2 函数对象需要使用外部变量和变量值以上就是必须嵌套在一个函数里,必须返回一个调用外部变量函数对象

    5.1K11

    和计数器

    但是,全局作用域是无法访问嵌套函数子函数,所以我们必须将子函数作为返回出来,使其暴露在全局作用域下。...(){return(++counter),由于add存在自由变量counter,所以它必须到定义该函数所在那个作用域中去寻找该变量,也就是到父函数中去寻找。...基于这道题,我们不难看出使用函数好处: 1、缓存: 最显而易见好处,就是可以实现数据缓存,我们可以把一个需要长期用到变量作为相对于函数自由变量,在函数里直接使用它。...因此该自由变量初始化一次,但却可以通过多次调用函数来使用。这比起我们直接函数定义初始化变量,多次调用则多次初始化做法,效率更高。...函数常见一种用途就是上面例子—–实现计数功能。 2、实现封装: 自由变量只能被函数本身或者其子函数访问,而不能被函数之外函数访问。这就实现了面向对象封装性,更安全更可靠。

    1.1K10

    Python(Python Closures)介绍

    当外部函数返回内部函数,内部函数会保留对外部函数作用域引用,形成是为了解决自由变量(free variable)问题,即在函数内部变量,可以在函数外被访问和调用。...Why:python自由变量原理解释,为什么要有 开始对介绍时候,有这么一段话: Python不要求声明变量,而是假定在函数定义体赋值变量是局部变量。...这时候出现了。 是一种函数,它会保留定义存在自由变量绑定,这样调用函数, 虽然定义作用域不可用了,但是仍然能使用那些绑定。...这就是作用,通过返回一个内部函数方式,保留了对自由变量绑定,解决了自由变量访问问题, 并没有使用global关键字,但是可以访问到了外部函数make_averager定义局部变量。...作者: quantgalaxy@outlook.com 欢迎交流 3.1.4 nonlocal 是不是所有自由变量都可以通过直接访问呢?

    59130

    深入理解与装饰器

    一、①定义是指一个函数(内层函数)能够“记住”并访问它所在作用域变量(外层函数变量),即使在外层函数已经返回情况下。...②优缺点优点:无需定义全局变量即可实现通过函数持续地访问、修改某个值使用变量所用于在函数内,难以被错误调用修改缺点:内部函数会持续引用外部函数值,导致这一部分内存无法释放,一直占用内存③基本写法...④nonlocal关键字在函数(内部函数)想要修改外部函数变量值,需要用nonlocal关键字声明这个外部变量。...num1 初始值为 10,每次调用 fn(10) ,都会把 10 加到 num1 上,并输出更新后值。...其工作流程如下:使用 @outer 装饰 sleep 函数,它会把 sleep 函数传递到 outer 函数;outer 返回一个 inner 函数,这个 inner 函数包含原来 sleep 函数

    8310
    领券