這是代碼
function rangeOfNumbers(startNum, endNum) {
return startNum === endNum
? [startNum]
: rangeOfNumbers(startNum, endNum - 1).concat(endNum);
}
我知道直到startNum等于endNum它會自動回憶,但我不明白的是值存盤在哪里?
比如說它是rangeOfNumbers(3,6)
所以它會是這樣的:
6-1
5-1
4-1
對?每次將數字添加到陣列中,我們都會得到[3,4,5,6],但我不明白它如何以及在哪里存盤這個陣列。
如果我沒記錯的話,concat合并兩個或多個陣列,但是沒有陣列。
我只是想對它有一個全面的了解。否則,我不會記住它,也無法使用它。
uj5u.com熱心網友回復:
一旦滿足中斷條件(startNum === endNum),就會回傳一個陣列([startNum])。這樣的物件有一個concat函式可以冒泡另一個陣列,依此類推,直到第一次呼叫。
在簡歷中:陣列從中斷條件開始,endNum并在每個回傳值上連接起來,這又是一個陣列。
uj5u.com熱心網友回復:
當輸入一個塊(以陳述句開頭{并包含陳述句的東西)時,就會創建一個新的“變數環境”。您可以將其視為將該塊執行的每個識別符號映射到其值的東西。
每次呼叫函式時,都會創建一個新的此類環境。
在這種情況下,引數startNum和endNum存盤在第一次呼叫函式時的環境中。然后,當解釋器遇到
rangeOfNumbers(startNum, endNum - 1).concat(endNum);
當前運行的函式(與剛才描述的環境相關聯的函式)被掛起,一個新函式被放入呼叫堆疊,創建另一個環境。該程序不斷重復,直到到達遞回邏輯的末尾并[startNum]回傳(或堆疊被炸毀)。那時,你有一堆rangeOfNumbers函式在進行中,每個函式都有自己的環境。那時,您可以將其想象為
rangeOfNumbers { startNum: 3, endNum: 5 } (this is the intial call; currently suspended)
rangeOfNumbers { startNum: 4, endNum: 5 } (currently suspended)
rangeOfNumbers { startNum: 5, endNum: 5 } (executing, about to return)
最里面的函式回傳它[startNum]并終止,所以最后一個函式恢復,現在有了可用的回傳值:
: rangeOfNumbers(startNum, endNum - 1).concat(endNum);
endNum當為 5時,被評估為:
: [5].concat(endNum);
該程序繼續向上堆疊,直到完成所有遞回呼叫,并且您只有初始
rangeOfNumbers { startNum: 3, endNum: 5 }
然后完成自己。
因此,當遞回呼叫正在進行時,先前呼叫的值存盤在每個呼叫的環境中。
如果我沒記錯的話, concat 合并了兩個或多個陣列,但是沒有陣列。
[startNum]是在遞回的最內點處回傳的陣列。concat還可以通過將一個陣列作為引數并將要附加的值作為另一個陣列來創建一個新陣列。例如,[5].concat(4)計算結果為[5, 4]。
uj5u.com熱心網友回復:
如果我沒記錯的話, concat 合并了兩個或多個陣列,但是沒有陣列。
你是絕對正確的。endNum不是陣列。但是,如果您在檔案中進一步concat閱讀,提供給的引數可以是陣列或值。
引數
valueN選修的要連接成新陣列的陣列和/或值。如果省略所有 valueN 引數,則 concat 回傳呼叫它的現有陣列的淺表副本。有關詳細資訊,請參閱下面的說明。
Javascript 函式在設計上是可變引數的,因此該方法似乎concat利用這一點來接受單個引數以附加到現有陣列的副本。
我知道在 startNum 等于 endNum 之前它會自動回憶,但我不明白的是值存盤在哪里?
如果您使用顯式變數名撰寫函式可能會有所幫助
function rangeOfNumbers(startNum, endNum) {
if (startNum === endNum) {
return [startNum];
}
const currentRange = rangeOfNumbers(startNum, endNum - 1);
return currentRange.concat(endNum);
}
如您所見,值(或endNum)存盤在呼叫 range 函式回傳的陣列中[startNum, endNum - 1]。
關于遞回的最棘手的部分在于,您看不到這些中間值存盤在哪里,直到像魔術一樣,我們到達了基本情況,你瞧,我們有一個陣列!
答案是回傳的陣列rangeOfNumbers(startNum, endNum - 1)保存在堆疊記憶體中,直到需要回傳。堆疊與堆的討論在這里將是相當離題的,但在這里幾乎涵蓋了:
堆疊和堆是什么以及在哪里?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/412574.html
標籤:
