在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…因为它是向后的