【问题标题】:Closure, recursion and settimeout - Empty arrays being logged闭包、递归和 settimeout - 记录空数组
【发布时间】:2020-04-16 17:50:04
【问题描述】:

以下函数被递归调用,为“输入”和常量“延迟”传递不同的值。为“输入”传递的值是一个对象数组。我遇到的奇怪行为是,虽然第一个 console.log 单独记录每个数组,但 settimeout 中的一个记录了多个空数组,并且只有最后一个数组内部有实际值:

function setDelay(input, delay) {
  console.log(JSON.parse(JSON.stringify(input)));
  setTimeout(function() {
    console.log(JSON.parse(JSON.stringify(input)))
  }, delay)
}

根据我对闭包如何工作的理解,我猜想两者应该始终相同,因为值被单独传递给每个函数,然后在展开过程中可用,就像它过去可用的方式一样第一次通话。

我还尝试了使用 try-catch 的代码变体,但结果相同。有人知道我对闭包的理解缺乏细节吗?

编辑:在这里你可以找到整个递归实现:https://jsbin.com/mijitawaku/edit?js,console

【问题讨论】:

  • 使用shiftunshiftsplice,你可以改变你的数组。因此,尽管您在两个地方克隆了相同的项目,但是当它处于不同的状态时您会这样做。您可以通过返回新项目而不在 mergeSort 中更改来解决此问题。
  • 请注意,要求发帖者在此处包含他们的代码的原因是有时不清楚什么是相关的。在这种情况下,重要的代码没有在现场显示,而是停留在外部资源 (JSBin) 中,可能会被更改或删除。所以下一次,请确保您包含任何可能涉及实际问题的内容,而不仅仅是指向它的链接。

标签: javascript arrays recursion closures settimeout


【解决方案1】:

您正在记录相同的数组,但它的项目发生了变化。如果您希望项目始终相同,则需要复制数组。由于您使用的是JSON.stringify,这很容易:

function setDelay(input, delay) {
  input = JSON.parse(JSON.stringify(input));
  console.log(input);
  setTimeout(function() {
    console.log(input)
  }, delay)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2020-05-15
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    相关资源
    最近更新 更多