在控制台的 Javascript 函数中访问多个变量之一。

Accessing one of a number of variables within a Javascript function in console.

我有以下用于十瓶保龄球计分系统的代码,我正尝试在分数增加时访问控制台中的 'score' 变量。当我通过输入 var game = new BowlingGame() 创建一个新游戏时,我然后 运行 命令 game.roll(5) 来获得分数,但是当我输入 var myScore = game.score() 然后输入 myScore 进入控制台,我得到 NaN。我也刚刚尝试输入 game.score() 但无法检索它。当我继续创建新卷时,是否可以检索更新的分数?

var BowlingGame = function() {
    this.rolls = [];
    this.currentRoll = 0;
};

BowlingGame.prototype.roll = function(pins) {
    this.rolls[this.currentRoll++] = pins;
};

BowlingGame.prototype.score = function() {
    var score = 0;
    var frameIndex = 0;
    var self = this;

    function sumOfBallsInFrame() {
        return self.rolls[frameIndex] + self.rolls[frameIndex + 1];
    }

    function spareBonus() {
        return self.rolls[frameIndex + 2];
    }

    function strikeBonus() {
        return self.rolls[frameIndex + 1] + self.rolls[frameIndex + 2];
    }

    function isStrike() {
        return self.rolls[frameIndex] === 10;
    }

    function isSpare() {
        return self.rolls[frameIndex] + self.rolls[frameIndex + 1] === 10;
    }

    for (var frame = 0; frame < 10; frame++) {
        if (isStrike()) {
            score += 10 + strikeBonus();
            frameIndex++;
        } else if (isSpare()) {
            score += 10 + spareBonus();
            frameIndex += 2;
        } else {
            score += sumOfBallsInFrame();
            frameIndex += 2;
        }
    }
    return score;
};

错误出现在函数 sumOfBallsInFrame 中,其中 self.rolls[frameIndex + 1] 试图访问 rolls 数组中没有值的位置。这使得函数 5 + undefined 的结果变为 NaN 因为 undefined 不是数字。

var BowlingGame = function() {
  this.rolls = [];
  this.currentRoll = 0;
};

BowlingGame.prototype.roll = function(pins) {
  this.rolls[this.currentRoll++] = pins;
};

BowlingGame.prototype.score = function() {
  var score = 0;
  var frameIndex = 0;
  var self = this;

  function sumOfBallsInFrame() {
    if (typeof self.rolls[frameIndex + 1] == 'undefined') return self.rolls[frameIndex];
    return self.rolls[frameIndex] + self.rolls[frameIndex + 1];
  }

  function spareBonus() {
    if (typeof self.rolls[frameIndex + 2] == 'undefined') return 0;
    return self.rolls[frameIndex + 2];
  }

  function strikeBonus() {
    if (typeof self.rolls[frameIndex + 2] == 'undefined') return 0;
    return self.rolls[frameIndex + 1] + self.rolls[frameIndex + 2];
  }

  function isStrike() {
    return self.rolls[frameIndex] === 10;
  }

  function isSpare() {
    if (typeof self.rolls[frameIndex + 1] == 'undefined') return false; // cannot be a spare yet
    return self.rolls[frameIndex] + self.rolls[frameIndex + 1] === 10;
  }

  for (var frame = 0; frame < this.currentRoll; frame++) {
    if (isStrike()) {
      score += 10 + strikeBonus();
      frameIndex++;
    } else if (isSpare()) {
      score += 10 + spareBonus();
      frameIndex += 2;
    } else {
      score += sumOfBallsInFrame();
      frameIndex += 2;
    }
  }
  return score;
};

var game = new BowlingGame();

game.roll(5);
console.log(game.score());