【问题标题】:Functions having closure on different versions of the same function scope在同一函数范围的不同版本上具有闭包的函数
【发布时间】:2018-04-28 19:30:52
【问题描述】:

考虑这段代码:

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

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

发生的情况是,每个函数调用在调用其相关 setTimeout 函数时都获得了正确的值范围在某个时间点,但我无法理解这个解释,或者我首先错过了范围的含义,有人可以详细说明吗?谢谢。

【问题讨论】:

  • 很难理解你在问什么或困惑是什么
  • 我很困惑回调函数在 foo 函数的作用域上有闭包,但状态不同(每个都有不同的 a 值)。

标签: javascript callback closures


【解决方案1】:

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

  setTimeout(function(){

那是被关闭的函数,它执行的作用域是foo当前执行的中间作用域记录。当你打电话时:

  foo(1)

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

【讨论】:

  • 所以实际上每次调用 foo 都会创建不同的作用域?
  • @mohamed 我更喜欢称它们为 范围记录 但是是的,就是这样
猜你喜欢
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
相关资源
最近更新 更多