调用函数而不在Javascript中输入其参数

调用函数而不在Javascript中输入其参数,javascript,Javascript,我正在尝试创建一个名为PIG的老式骰子游戏的JavaScript版本。它包括掷骰子和记录每次掷骰子的总数。我需要能够在一个函数中保存每个卷,然后能够调用所述函数返回当前卷分数 此方法获取当前卷的金额,并将其存储到变量total中,然后返回当前总额变量 function rollTotal(amount) { return amount; } 我首先调用该函数并将掷骰子的分数插入amount参数 var dieOne = 1; var dieTwo = 2; rollTotal(

我正在尝试创建一个名为PIG的老式骰子游戏的JavaScript版本。它包括掷骰子和记录每次掷骰子的总数。我需要能够在一个函数中保存每个卷,然后能够调用所述函数返回当前卷分数


此方法获取当前卷的
金额
,并将其存储到变量total中,然后返回当前
总额
变量

  function rollTotal(amount) {
  return amount;
  }

我首先调用该函数并将掷骰子的分数插入
amount
参数

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

然后我调用函数返回当前分数,如下所示

rollTotal()

我得到这个

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)
而不是专门针对
未定义的
进行测试


编辑:正如@Paul S.指出的,关于参数是否通过的最佳测试是
arguments.length==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());

在JavaScript中,您可以通过查看来检查调用函数时是否传递了参数。下面是如何检查调用函数时是否传递了任何参数

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

为什么要使用函数?
=
操作符工作正常

// 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?";

amount=amount==null?defaultValue:amount
这没有意义
rollTotal
不更新任何变量。这只是一个标识函数,因此
rolltoal()
返回
undefined
,而不是
NaN
@Oriol谢谢提醒!这确实是我得到的,我只是发布了一个打字错误。我纠正了我的错误。下层选民愿意解释一下这里出了什么问题吗?你在读OP问题中我遗漏的东西吗?你可以做的另一个测试是
arguments.length==0
,否则这个问题的IIFE版本基本上就是我想要的written@PaulS. - 是的,测试
参数。长度可能是正确的方法。@TedHopp-谢谢!这就行了。我忘了这个选项。你得到了答案。最近的投票人愿意解释他们的理由吗?你为什么要检查
参数[0]
是否存在而不是
数量
?此外,问题中概述的函数并不是掷骰子,它只是保存了一个值。