2016-07-08 76 views
4

當我試圖實現一個無止境的提示系統時,我注意到今天早上有些奇怪的事情。遞歸提示返回undefined

以下代碼返回下2個方案2個不同的輸出:

方案1:上第一提示和輸入數字確定

輸出1:number that was entered


情景2:取消第一提示然後輸入數字並確定

輸出2:undefined


我困惑,爲什麼發生這種情況。首先,當我在if語句中檢查時,它是如何返回的未定義的?第二,我的印象是,在JavaScript中未定義意味着一個變量已經被聲明,但尚未被分配,在這種情況下,我正在分配var number

var number = null; 
 
number = Prompt(); 
 
$("p").html("Number was " + number); 
 

 
function Prompt() 
 
{ 
 
    var input = prompt("Enter a number", ""); 
 
    if(input === null || input === "" || input === undefined || isNaN(input)) 
 
     Prompt(); 
 
    else 
 
     return input; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 

 
<p></p>

回答

5

只有一個代碼路徑返回一個值,讓它從遞歸調用返回。在JavaScript中,如果一個函數沒有返回語句結束它的回報是undefined

function Prompt() 
{ 
    var input = prompt("Enter a number", ""); 
    if(input === null || input === "" || input === undefined || isNaN(input)) 
     return Prompt(); 
    else 
     return input; 
} 
+0

您應該提到,只有一個字符串是從'prompt'返回。如果'input'實際上是'NaN','isNaN('anystring')'將總是返回'true',而'Number.isNaN'只會返回'true'。推薦'parseInt'等。 – naomik

+0

@naomik:不正確。 'isNaN(「」)=== false'我不知道它爲什麼返回false,但也許你可以嘗試'isNaN(parseFloat(input))' –

+0

@ThomasF謝謝,我不知道,我只是困擾要記住'window.isNaN'是一塊垃圾。 'Number.isNaN'更加實用。 – naomik

-1

當第一個提示被取消另一個提示()迭代被調用,但它的返回值是不是在任何地方拍攝。第一次迭代然後返回原始未定義的返回值。

穆薩的答案顯示瞭解決這個問題的一種方法。另一個辦法是:

function Prompt() { 
    var input = null; 
    while(input === null) { 
     input = prompt("Enter a number", ""); 
    } 
    return input; 
} 
3

window.prompt總是返回一個字符串或null所以也懶得檢查undefined,或isNaN

而且,由於window.prompt返回一個字符串,則需要以使用window.parseInt來可靠地將其轉換爲數字。

function Prompt() { 
 
    var n = window.parseInt(window.prompt("Enter a number"), 10) 
 

 
    if (Number.isNaN(n)) 
 
    return Prompt() 
 
    else 
 
    return n 
 
} 
 

 
alert("Your number is: " + Prompt())