调用函数而不在Javascript

时间:2015-09-06 00:30:42

标签: javascript

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

这是获取当前掷骰的amount并将其存储到变量total中的方法,随后返回当前的total变量。

  function rollTotal(amount) {
  return amount;
  }

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

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

然后我调用函数返回当前得分......

rollTotal()

我得到了这个......

undefined

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

4 个答案:

答案 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;
}
相关问题