[英]Why would a return be undefined but console.log return an int?
所以我有以下功能:
var multiplyT = function(a, b, acc) {
if (b == 0) {
console.log("BASE CASE: ", acc);
return acc;
} else {
b--;
acc = acc + a;
console.log("NOT THE BASE CASE: ", a,b,acc);
multiplyT(a, b, acc);
}
}
它被調用:
console.log(multiplyT(5,3,0));
並給出這個:
NOT THE BASE CASE: 5 2 5
NOT THE BASE CASE: 5 1 10
NOT THE BASE CASE: 5 0 15
BASE CASE: 15
undefined
作為輸出。 令我困惑的是為什么acc會為console.log提供正確的值,但根據返回的內容為“undefined”。
在你的else塊中,它應該是return multiplyT(a, b, acc);
這個不錯。 遞歸可以使你的頭旋轉。 它未定義的原因是因為並非所有迭代都返回一個值,而對於那些沒有返回值的那些,你會得到未定義的 - 就像你將一個變量設置為任何不返回值的函數一樣。
然而,它會因遞歸而變得混亂,因為在這種情況下您看到的返回值來自第一次調用和最后完成的迭代。 與常規方法調用不同的是,返回會中斷方法的執行 - 將其從任何地方發送回來,遞歸仍然可以通過調用堆棧返回,返回它必須返回的任何值,包括undefined,反向他們被稱為的順序。 所以它實際上給你的console.log調用了四個返回值:15,undefined,undefined,undefined。
因為它是同步的,所以console.log在它調用的方法完成之前無法執行。 它輸出的是它獲得的最后一個值,或者是未定義的。 如果你在else塊中的方法調用后堅持返回,你會看到你得到5,或者在函數第一次迭代后得到acc的值。
var multiplyT = function(a, b, acc) {
if (b == 0) {
console.log("BASE CASE: ", acc);
return acc;
} else {
b--;
acc = acc + a;
console.log("NOT THE BASE CASE: ", a,b,acc);
multiplyT(a, b, acc);
return acc;
}
}
console.log(multiplyT(5,3,0));
您還需要從else塊返回。
在你的情況下,即使acc
的值被更新,當b != 0
時,返回值為mot
var multiplyT = function(a, b, acc) { if (b == 0) { console.log("BASE CASE: ", acc); return acc; } else { b--; acc = acc + a; console.log("NOT THE BASE CASE: ", a, b, acc); return multiplyT(a, b, acc); //return here } } console.log(multiplyT(5, 3, 0));
你正在遞歸地調用multiplyT函數,但是你沒有控制返回。 然后,multiplyT(5,3,0)在第一次調用中不返回值,然后函數返回undefined。
堆棧正在執行,但第一次調用更重要:它需要從返回最終值的遞歸內部函數中獲取值。
修復else分支中的代碼,以便返回遞歸調用:
var multiplyT = function(a, b, acc) {
if (b == 0) {
console.log("BASE CASE: ", acc);
return acc;
} else {
b--;
acc = acc + a;
console.log("NOT THE BASE CASE: ", a,b,acc);
return multiplyT(a, b, acc);
}
}
我在處理我的一個項目時想出了一個很好的解決方案,我在其中遍歷一個復雜的JSON對象,返回一些搜索id的數據。
var multiplyT = function(a, b, acc) {
if(b == 0) {
console.log("BASE CASE : ", acc);
return acc;
} else {
var ret;
b--; acc += a;
console.log("NOT THE BASE CASE: ",a,b,acc);
while( ret = multiplyT(a,b,acc) ) {
return ret;
}
}
}
在這里,我們運行一個while循環來查看遞歸函數調用是返回true值還是undefined。 如果返回undefined
其他內容,它將返回數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.