2016-07-26 128 views
0

我的一個朋友問我爲什麼這個代碼無法正常工作,取消提示。爲什麼提示返回有時爲空作爲字符串

<script type="text/javascript"> 
    var name = prompt("Enter your name:", ""); 
    if (!name) { 
     name = "unknown";  
    } 
    var ans =("<h2>" + "Hello, "+ name + "!"+"</h2>");  
    document.write(ans);   
</script> 

這裏是jsfidle https://jsfiddle.net/085svr3u/

我發現,在上述的propmt示例返回 「無效」,即。 null作爲字符串通過取消。我不知道爲什麼。

我試圖玩原始代碼,並重構了一下。現在它按預期工作。但我仍然沒有解釋。

<script type="text/javascript"> 

    function test() { 
     var name = prompt("Enter your name:", ""); 
     if (!name) { 
      name = "unknown";  
     } 
     var ans =("<h2>" + "Hello, "+ name + "!"+"</h2>");  
     document.write(ans);   
    } 

    test(); 
</script> 

,這裏是修改後的版本https://jsfiddle.net/085svr3u/1/

預先感謝您。

+1

單詞_sometimes_在編程IMO時沒有任何意義。它可以或不可以......'null'的原因可能是用戶在'prompt'輸入'null'作爲輸入。 – Rayon

+0

@SLaks問題是,爲什麼'null'成爲一個字符串。 – nicael

+0

您已經粘貼了相同的代碼兩次。我想第一個應該沒有那個if語句? – nicael

回答

3

這裏是你的答案

關鍵字「」在javascript在全球範圍內使用時會導致問題

如果連你的第一種情況下,你用「FNAME」或者替換「名」其他變量名稱將停止給予null。

<script type="text/javascript"> 
    var fname = prompt("Enter your name:", ""); 
    if (!fname) { 
     fname = "unknown";  
    } 
    var ans =("<h2>" + "Hello, "+ fname + "!"+"</h2>");  
    document.write(ans);   
</script> 

在第二種情況下,變量「」本地函數內部產生,它不與window.name衝突。因此,它工作正常

+1

@nicael是的,這裏學到的教訓是保持使用全局變量的最低限度。 – JLRishe

+0

哦,大聲笑的確如此。對不起!我真笨。 – nicael

-1

您的問題的一個答案是,當用戶通過單擊取消或按下轉義逃脫提示框時它將返回空值。

進一步澄清概念閱讀: -

這是功能正式defiinition:

result = window.prompt(message, default); 

結果:是包含用戶,或空輸入的文本字符串。

消息:是向用戶顯示的字符串。此參數是可選的,如果在提示窗口中沒有任何內容顯示,則可以省略該參數。

默認值:是一個字符串,其中包含文本輸入字段中顯示的默認值。它是一個可選參數。 注意在Internet Explorer 7和8中,如果不提供此參數,字符串「undefined」是默認值。 (以上來自Mozilla's definition of prompt()

現在,我們得出這樣的結論:

提示()返回null或 「串」 可以包括 「」(空字符串)。

現在我們有三個狀態檢查:

:用戶點擊取消或按Esc鍵。

「」(空字符串):用戶點擊確定或按Enter鍵,沒有文字輸入

「字符串」:用戶輸入一些文字。

希望它有幫助...!

3

@RahulArora已基本提供正確的答案,而是提供有關更多的照明發生了什麼:

瀏覽器有一個內置的叫name全局變量存儲窗口的名稱。如果您爲其分配值,則您分配的值將轉換爲字符串。這與prompt()無關;你可以這樣觀察它:

var name = null; 
console.log(typeof name); // "string" 
console.log(name.length); // 4 

這個故事的寓意是:他們是不是已經被用於別的東西不要使用全局變量,除非你絕對必須的,如果你這樣做,確保!

+0

感謝您的進一步澄清。非常感謝 –

+0

@JLRishe謝謝。我不知道'name'是一個全局變量。我也不知道這個'魔術'轉換。 – Tima

相關問題