簡體   English   中英

關閉、遞歸和設置超時 - 記錄空數組

[英]Closure, recursion and settimeout - Empty arrays being logged

正在遞歸調用以下函數,並為“輸入”和常量“延遲”傳遞不同的值。 為“輸入”傳遞的值是一個對象數組。 我遇到的奇怪行為是,雖然第一個 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

您正在記錄相同的數組,但其項目發生了變化。 如果您希望項目始終相同,則需要復制數組。 由於您使用的是JSON.stringify這很簡單:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM