在JavaScript中返回NaN和Undefined
函数在JavaScript中返回NaN和Undefined,javascript,scope,Javascript,Scope,函数moveIt返回NaN 它应该随机返回40到6的倍数,并保留以前的值 如果我删除它,它将返回未定义的 我知道这是一个范围问题。请帮助。您正在使用的请在初始化之前完成!您必须交换代码行: var currDice, totDice, dice, complete; function moveIt(){ dice = Math.floor(Math.random()*6) + 1, currDice = 40, totDice = totDice+complete, compl
moveIt
返回NaN
它应该随机返回40到6的倍数,并保留以前的值
如果我删除它,它将返回未定义的
我知道这是一个范围问题。请帮助。您正在使用的请在初始化之前完成!您必须交换代码行:
var currDice, totDice, dice, complete;
function moveIt(){
dice = Math.floor(Math.random()*6) + 1,
currDice = 40,
totDice = totDice+complete,
complete = dice * currDice
return totDice;
};
我试图指出这种方法是如何工作的
您可以在没有初始值的情况下调用此函数。然后(在total | | 0之前)
是(未定义的| | 0)
,并将求值为0
,这是JS逻辑,您得到一个骰子的结果
如果您将一个值传递给此函数,它将用于向其添加complete
。通过1000和120,你可以得到1120
所有其他变量仅在此函数中可用。初始值totDIce
未定义,当您将未定义的值添加到某个值时,您会将该值转换为NaN
function moveIt(beforeTotal) {
var dice = Math.floor(Math.random()*6) + 1;
var currDice = 40;
var complete = dice * currDice;
var totDice = (beforeTotal || 0)+complete;
return totDice;
};
var total = moveIt();
console.log(total);
total = moveIt(total);
console.log(total);
var-totDice
将有未定义的
,这就是为什么会得到NaN
function moveIt(beforeTotal) {
var dice = Math.floor(Math.random()*6) + 1;
var currDice = 40;
var complete = dice * currDice;
var totDice = (beforeTotal || 0)+complete;
return totDice;
};
var total = moveIt();
console.log(total);
total = moveIt(total);
console.log(total);
在第一行分配totDice=0
同时移动上面的complete=dice*currDice
行,因为complete
还没有值
function moveIt(){
//memoizing the mutable value as key of the function itself
moveIt.totDice = moveIt.totDice || 0;
// you might wanna wrap it with parseInt()/Math.floor()/Math.ceil()
var dice = Math.floor(Math.random()*6) + 1;
var currDice = 40;
var complete = dice * currDice;
var totDice = totDice+complete;
return moveIt.totDice ;
};
您可以使用浏览器的集成控制台
在Chrome:Tools>Javascript控制台中。或者CTRL+SHIFT+J。在那里,您可以从代码中选择console.log并在那里查看,或者可以使用“源”选项卡(位于面板顶部)。导航到该文件,单击它,您可以通过勾选行号在所需行中放置断点
在Firefox中:工具>开发>Web控制台。或者CTRL+SHIFT+K。Yu可以像前面提到的那样以类似的方式进行调试
您还可以使用Firebug之类的工具。参见您在哪里初始化了完成
?最后三行与你的问题有什么关系?您应该使用var
、let
或const
声明变量。您应该更清楚地说明代码以及您要做什么。你从哪里调用moveIt
函数?这个函数moveIt
返回NaN
不,它什么也不返回,因为它甚至不解析,因为它的var
关键字放错了地方。@trincot它现在只返回NaN,正如我所说的globally我认为你的问题应该命名为“如何调试脚本”(有人删除了作者请求调试帮助的问题结尾…)totDice最初也是未定义的,所以它仍然会将自己转换为Nan基本上你传递增量的初始值,保留一个引用,然后传递增量值等等。我想@Caesar2011应该解释一下,因为这是他的答案。非常感谢你的帮助……那么你说这个参数在Total之前保持不变us值?很抱歉打扰您,但请解释一下plz并感谢u.TL;DR:是的,这是一个初始值。您可以在没有初始值的情况下调用此函数。然后(在Total | | 0之前)是(未定义| | 0)并将计算为0,这是JS逻辑,您将得到一个骰子的结果。如果您将一个值传递给此函数,它将用于向其添加complete
。通过传递1000和complete gets 120,您将得到1120。我希望它清晰。@Caesar2011感谢“通过传递1000和complete gets 120”的帮助通过这个例子,我们得到了它,但是我们通过了前面的骰子值,假设它是(3*40)120,现在是(1)ie 40,因此120+40=160…因为它是向后的