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

时间:2018-04-28 19:30:52

标签: javascript callback closures

考虑这段代码:

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

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

当调用其相对的setTimeout函数时,每个函数调用都会得到正确的a值,这样就意味着每个传递的回调函数都在foo函数的范围内有一个闭包但每个都有这个范围在某个时间点的快照,但我不能理解这个解释,或者我错过了范围首先意味着什么,任何人都可以详细说明吗?感谢。

1 个答案:

答案 0 :(得分:1)

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

  setTimeout(function(){

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

  foo(1)

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