2013-04-29 72 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