2013-04-29 71 views
1

我一直在四處尋找,我似乎無法找出爲什麼會發生這種情況或如何解決它。我已經嘗試了大約2天的不同事情,現在是在我把其餘的我的頭髮撕掉之前尋求幫助的時間(我是Java新手)Javascript編號是NaN

我知道代碼非常漫長時刻,但它的可讀性似乎爲什麼它不爲我工作。

 function getBaB() 
{ 
     var BaB=0; 
     var theForm = document.forms["prrform"]; 
     var basebab = theForm.elements["charbab"]; 
     BaB = basebab.value; 
     return BaB; 
} 

var armour_types = new Array(); 

//這是行不通

armour_types["Heavy"] = (getBaB.value) ; 

位//它只是將返回undefined,如果我parseInt函數然後我得到NaN的。我只是不明白爲什麼沒有定義。

armour_types["Medium"] = 10; 
armour_types["Light"] = 2; 
armour_types["Adamantine"] = 10; 
armour_types["Mithral"] = 5; 
armour_types["Unarmoured"] = 0; 


function calculateTotal() 
{ 
    var TotalPRR = getArmourType(); 
    var divobj = document.getElementById('totalPRR'); 
    divobj.style.display='block'; 
    divobj.innerHTML = "Total PRR "+TotalPRR; 

} 

function hideTotal() 
{ 
    var divobj = document.getElementById('totalPRR'); 
    divobj.style.display='none'; 
} 

如果需要,我可以發佈HTML。

在此先感謝:

+0

實際上是否調用了'getBaB.value',或者你忘了示例中的'()'? – NilsH 2013-04-29 10:19:00

+4

'getBaB()'已經返回感興趣的元素的值。所以把你的代碼改爲'armour_types [「Heavy」] = getBaB();' – Cyclonecode 2013-04-29 10:19:41

+0

不,我沒有忘記()在這個例子中,我一直寫錯了整個時間,但改變它仍然沒有工作。 – 2013-04-29 10:28:32

回答

1

Kirubhananth Chellam是對他的回答正確:

armour_types["Heavy"] = getBaB(); 

但是當你是新來的Javascript(Java有一個非常不同的語法)我會嘗試解釋你要去哪裏高級錯誤,看看我能否進一步幫助你。

Javascript是鬆散類型 - 這是整個語言的關鍵。考慮...

var x = 0; 

......正如你想象的那樣,賦值0到x。簡單但作爲任務的關鍵出發點...

x = "hello" 

...不是那麼容易理解。在強類型語言中,這將返回一個類型錯誤,然而它是Javasript,這是完全可以接受的。因爲...

x = function(){ 
    var y = 0; 
    return y; 
} 

...即使在x被分配了一個數值之後。

其原因,這是JavaScript時在運行時,函數聲明如被解釋爲重要...

function x(){ 
    ... 
} 

...以同樣的方式實際上是解釋爲變量賦值...即.. ..

var x = function(){ 
    ... 
} 

...這可能會導致奇怪的行爲,如果你超載變量x(見起重http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html)。

回到你的問題,對getBaB.value的調用意味着你正在調用getBaB作爲一個變量,該變量被賦予一個名爲'value'的屬性的對象。

在你的代碼中,Javascript將返回函數定義(這在技術上是一個對象)作爲值getBaB,它沒有'value'屬性,因此undefined

注意:嘗試解析undefined作爲int奇怪地返回NaN(未定義)。

至於你的函數...

function getBaB() 
{ 
     var BaB=0; 
     var theForm = document.forms["prrform"]; 
     var basebab = theForm.elements["charbab"]; 
     BaB = basebab.value; 
     return BaB; 
} 

return BaB沒有返回一個對象,雖然你可能會認爲它。返回到javascript被鬆散類型; BaB = basebab.value;意味着BaB是一個賦值的數值,而不是具有「值」屬性的對象。

有趣的是,getBaB()仍然可以返回「未定義」如果theForm.elements["charbab"];沒有找到和「」如果一個值不在「charbab」設置爲它覆蓋BAB = 0(鬆散類型;)) 。

因此,我建議您確保basebab返回一個邏輯值,以確保您的代碼在快速if語句中可靠運行!

希望這會有所幫助。

GW

+0

這確實有幫助,我真的不應該在學習一種新語言時跳入深層,但我認爲這是樂趣的一部分.. – 2013-04-29 11:17:40

+0

我可以看到我要去哪裏錯,但我現在怎麼樣將數組「鏈接」到HTML表單。對不起,愚蠢的問題,Java正在讓我的大腦融化:) – 2013-04-29 11:23:35

+0

輝煌。樂意效勞! 所以我已經放在一起的一個快速的例子,你可以按照從窗體獲得結果(突出上述方法): http://jsfiddle.net/CGWGreen/7Yj4H/2/ 雖然我會建議,作爲JavaScript的新角色,你試試JQuery。它是一個非常強大的框架,並使這樣的任務像sinch;) 快樂的編碼隊友。 – 2013-04-29 12:03:36

0

您的方法調用是錯誤的。只需將該方法調用爲methodname();

所以,在你的代碼

armour_types["Heavy"] = getBaB(); 

將工作我猜。

+1

仍然越來越未定義這一點。 – 2013-04-29 10:27:54

0

首先,getBAB()必須返回一個數組。我有一個例子,從你的代碼如下

function BlockID() { 
     var IDs = new Array(); 
     IDs[0] = "a"; 
     IDs[1] = "b"; 
     IDs[2] = "c"; 
     IDs[3] = "d"; 
     return IDs; 
} 

    var isReady = true; 
    function doSaveAs(){ 
    var armour_types = new Array(); 
    armour_types["Heavy"] = BlockID(); 
    } 

<body> 
    <input type="button" onClick="doSaveAs();">click</input> 
</body> 
+0

我先把它放在一個數組中,然後我改變它,我應該堅持什麼感覺是正確的。 – 2013-04-29 11:18:33