javascript - 在同一函数作用域的不同版本上具有闭包的函数

标签 javascript callback closures

考虑这段代码:

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

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

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

最佳答案

闭包基本上只是一个函数引用,与对封闭范围记录的引用绑定(bind)在一起。所以在你的情况下:

  setTimeout(function(){

这就是被关闭的函数,它执行的作用域是 foo 当前执行的中间作用域记录。当您调用时:

  foo(1)

创建一个新的范围记录,其中a1,通常当foo完成执行时该记录将被丢弃,但由于闭包保留了对它的引用,这不会发生。现在,当超时结束时,闭包将被执行,并且对闭包的引用将丢失,因此对封闭范围记录的引用也会丢失,并且 a 最终被垃圾收集。当您多次调用 foo 时,会创建多个记录和闭包,因此 a 可以在回调中计算出不同的值,因为它们被解析为不同的记录。

关于javascript - 在同一函数作用域的不同版本上具有闭包的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50080318/

相关文章:

java - Java 8 闭包存储在哪里?

javascript - Handlebars 增加档次

javascript - 在具有动态高度的背景图像上创建渐变叠加

javascript - 正则表达式忽略捕获组内的捕获组

javascript - Highcharts固体规范动态更新

c# - 在 C# 中使用委托(delegate)作为 C DllImported 函数的回调

javascript - 如何检查 javascript 函数是否准备就绪/完成 (jQuery)

python - 如何更新 bokeh 中的 customJS 函数中的全局 python 变量?

closures - Tcl:惯用语

rust - Rust,在闭包内创建一个闭包,避免 “closure may outlive the current function”