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