2015-09-06 80 views
0

我正在尝试创建一个名为PIG的老式骰子游戏的JavaScript版本。它涉及滚动骰子并跟踪每个滚动的总和。我需要能够保存一个函数中的每个滚动,然后能够调用所述函数来返回当前滚动分数。在不输入Javascript参数的情况下调用某个函数


这是采用现有的卷筒,并将其存储的amount入变量总,随后返回当前total变量的方法。

function rollTotal(amount) { 
    return amount; 
    } 

我第一次调用该函数并插入掷骰子到amount参数的得分...

var dieOne = 1; 
var dieTwo = 2; 
rollTotal(dieOne + dieTwo); 

然后我调用该函数返回当前比分像这样...

rollTotal() 

,并正在此...

undefined 

有没有办法设置一个默认参数返回当前的分数,如果调用时没有输入参数?

+0

'amount = amount == null? defaultValue:amount' – elclanrs

+2

这没有意义。 'rollTotal'不更新任何变量。它只是一个身份函数,所以'rollTotal()'返回'undefined'而不是'NaN'。 – Oriol

+0

@Oriol感谢您的领导!这确实是我得到的,我刚刚发布了一个错字。我纠正了我的错误。 –

回答

0

一种流行的方式做,这是一个类的实例。

即:

function Dice() { 
    var amount; 

    this.rollTotal = function(_amount) { 
     // if an argument is supplied, assign it to the internal amount 
     if (typeof _amount !== "number") { 
      amount = _amount; 
     } 
     return amount; 
    }; 
} 

用法示例:

var dice = new Dice(); 
dice.rollTotal(3); 
console.log(dice.rollTotal()); 
+0

最近downvoter会照顾解释他们的推理吗? – jczimm

1

当你调用一个函数,并且不提供参数,则该参数势必undefined在函数中。所以,你可以做这样的事情:

var currentAmount = undefined; // or perhaps 0? 
function rollTotal(amount) { 
    if (typeof(amount) === 'undefined') { 
     return currentAmount; 
    } else { 
     currentAmount = amount; 
     return amount; 
    } 
} 

你可以做到这一点更优雅(更安全)使用封闭:

var rollTotal = (function() { 
    var currentAmount = undefined; 
    return function(amount) { 
     if (typeof(amount) === 'undefined') { 
      return currentAmount; 
     } else { 
      currentAmount = amount; 
      return amount; 
     } 
    }; 
}()); 

您可能还需要做的说法更稳健的测试并将任何非数字视为未定义。为undefined

!isNaN(parseFloat(amount)) && isFinite(amount) 

,而不是测试的具体做法是:你可以用下面的测试做到这一点。

编辑:由于@保罗S.所指出的,作为一个参数是否传递最佳的测试是arguments.length === 0

+2

下决心是否愿意解释这里有什么问题?你是否在OP的问题中读到我错过的东西? –

+0

你可以做的一个不同的测试是'arguments.length === 0',否则这个IIFE版本基本上是我所写的 –

+0

@PaulS。 - 是的,测试'arguments.length'可能是正确的选择。 –

0

在JavaScript中,你可以看看arguments object检查参数是否通过与否时被调用的函数。调用函数时,如何检查是否传递了argumemt。

function rollTotal(amount){ 
    if(arguments.length === 0) 
    return (a value when no arguments were passed); 
    else return amount; 
} 
+0

你为什么要检查'arguments [0]'是否存在而不是'amount'?此外,问题中概述的功能不会掷骰子,它只是保存一个值。 – jczimm

1

为什么使用函数? =运营商工作得很好。

// initial setup 
var rollTotal; 

// set in the middle of an expression 
"You just rolled " + (rollTotal = dieOne + dieTwo) + "!"; 

// recalling later in an expression 
"Last time you rolled " + rollTotal + ", what will you get this time?";