在相同函数范围的不同版本上具有闭包的函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在相同函数范围的不同版本上具有闭包的函数相关的知识,希望对你有一定的参考价值。

考虑一下这段代码:

function foo(a){
        setTimeout(function(){
            debugger;
            a;
        }, 1000);
    }

    foo(1);
    foo(2);
    foo(3);

发生的事情是每个函数调用在调用其相对setTimeout函数时获取正确的a值,因此以某种方式暗示每个传递的回调函数在foo函数的作用域上都有一个闭包但每个都有一个该作用域的快照。某个时间点,但是我无法理解这个解释,或者我错过了范围首先意味着什么,任何人都可以详细说明吗?谢谢。

答案

闭包基本上只是一个函数引用,它与对封闭范围记录的引用相关联。所以在你的情况下:

  setTimeout(function(){

这是关闭的函数,它执行的范围是当前foo执行的中间范围记录。你打电话的时候:

  foo(1)

使用a作为1创建一个新的范围记录,通常这个记录将在foo完成执行时被丢弃,但是当封闭保持对它的引用时,这不会发生。现在当超时结束时,闭包被执行并且对闭包的引用丢失,因此对封闭范围记录的引用也会丢失,并且a最终被垃圾收集。当你多次调用foo时,会创建多个记录和闭包,因此a可以在回调中评估不同的值,因为它们被解析为不同的记录。

以上是关于在相同函数范围的不同版本上具有闭包的函数的主要内容,如果未能解决你的问题,请参考以下文章

具有相同依赖项的不同版本的 nuget 包的 azure 函数

PHP中的闭包和匿名函数

图像上的OnClick()会添加具有不同信息的相同片段

函数进阶---作用域闭包装饰器

JavaScript闭包

Python使用闭包自动生成函数