我正在尝试创建一个名为PIG的老式骰子游戏的JavaScript版本。它涉及掷骰子和跟踪每个掷骰的总和。我需要能够在一个函数中保存每个卷,然后能够调用所述函数来返回当前的卷分。
这是获取当前掷骰的amount
并将其存储到变量total中的方法,随后返回当前的total
变量。
function rollTotal(amount) {
return amount;
}
我首先调用该函数并将骰子卷的分数插入amount
参数......
var dieOne = 1;
var dieTwo = 2;
rollTotal(dieOne + dieTwo);
然后我调用函数返回当前得分......
rollTotal()
我得到了这个......
undefined
如果在调用时没有输入参数,有没有办法设置默认参数来返回当前分数?
答案 0 :(得分: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;
}
};
}());
您可能还想对参数进行更强大的测试,并将任何非数字视为未定义。您可以使用以下测试执行此操作:
!isNaN(parseFloat(amount)) && isFinite(amount)
而不是专门针对undefined
进行测试。
编辑:正如@Paul S.指出的那样,关于参数是否通过的最佳测试是arguments.length === 0
。
答案 1 :(得分: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?";
答案 2 :(得分: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());
答案 3 :(得分:0)
在JavaScript中,您可以查看arguments object以检查在调用函数时是否传递了参数。以下是如何在调用函数时检查是否有任何参数被传递。
function rollTotal(amount){
if(arguments.length === 0)
return (a value when no arguments were passed);
else return amount;
}