Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在同一函数作用域的不同版本上具有闭包的函数_Javascript_Callback_Closures - Fatal编程技术网

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

Javascript 在同一函数作用域的不同版本上具有闭包的函数,javascript,callback,closures,Javascript,Callback,Closures,考虑这段代码: function foo(a){ setTimeout(function(){ debugger; a; }, 1000); } foo(1); foo(2); foo(3); 发生的情况是,当调用其相对setTimeout函数时,每个函数调用都会获得正确的a值,因此这意味着每个传递的回调函数在foo函数的作用域上都有一个闭包,但每个函数在某个时间点都有该作用域的快

考虑这段代码:

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
可以在回调函数中计算不同的值,因为它们被解析为不同的记录。

很难理解您的问题或混淆之处,我很困惑回调函数在foo函数的作用域上有闭包,但状态不同(每个函数都有不同的a值).所以实际上,每次调用foo都会创建不同的作用域?@mohamed我更喜欢称之为作用域记录,但是的,就是这样