Javascript TypeError:无法读取未定义的属性“Wins”?

Javascript TypeError:无法读取未定义的属性“Wins”?,javascript,object,methods,while-loop,Javascript,Object,Methods,While Loop,我已经得到了对象,并且我已经正确地调用了它们,但是我不断地得到这些错误。有人知道为什么吗?它说玩家对象的“胜利”没有定义,但很明显是这样的 这就是我给startGame打电话时所表现出来的;在控制台中 script.js:56 undefined还剩下NaN。 58全能的格兰特已经离开了 var playerName=提示“命名角色”; 变量播放器={ 姓名:playerName, 健康:40, 左:2, 胜利:0, 攻击伤害:functionnum{ 返回Math.floorMath.ran

我已经得到了对象,并且我已经正确地调用了它们,但是我不断地得到这些错误。有人知道为什么吗?它说玩家对象的“胜利”没有定义,但很明显是这样的

这就是我给startGame打电话时所表现出来的;在控制台中

script.js:56 undefined还剩下NaN。 58全能的格兰特已经离开了

var playerName=提示“命名角色”; 变量播放器={ 姓名:playerName, 健康:40, 左:2, 胜利:0, 攻击伤害:functionnum{ 返回Math.floorMath.random*2+1; }, healsRandom:functionnum{ 返回Math.floorMath.random*9+1; } };
console.logplayer.healsRandom 在定义玩家{}之前,您正在调用startCombat。

添加到@Jeff Matthews的答案中,即使您在创建玩家后调用了startCombat。还是不行,为什么

问题在于startCombat函数

function startCombat() {
  while (player.Wins < 5 && player.Health > 0) {
    attackOrQuit = prompt('Do you want to attack, heal or quit?');
    if (attackOrQuit === "heal") {
      player.Health +=  player.healsRandom;
      this.HealsLeft--;
      console.log(player.Name + " has healed and has " + player.Health + " health.")
    } else if (attackOrQuit === "quit") {
      break;
    }

    ...
但我已经在StartName函数中初始化了它

是的,你做了,但只是有点不对劲

在startGame内部,您在初始化player方面做得很好,但有一件事,您使用了var,这意味着,您正在startGame函数的作用域下创建一个名为player的新变量

function startCombat() {
  while (player.Wins < 5 && player.Health > 0) {
    attackOrQuit = prompt('Do you want to attack, heal or quit?');
    if (attackOrQuit === "heal") {
      player.Health +=  player.healsRandom;
      this.HealsLeft--;
      console.log(player.Name + " has healed and has " + player.Health + " health.")
    } else if (attackOrQuit === "quit") {
      break;
    }

    ...
因此,您创建的player变量将仅在startGame的作用域中可用

一种解决方案是省略var

当您省略var时,JavaScript将查找该变量,而不是创建一个新变量,如果没有找到,它将创建一个新的全局范围变量,否则,它将修改找到的变量

您还可以在另一个函数上使用全局范围内不可用的其他变量。与对手变量一样,它只是startCombat中的一个局部变量。是的,其他函数不知道它们

对正在发生的事情的简单解释:

var i = 0;

function start() {
    var i = 1; // <-- creates a new variable `i` in its own scope
    startAgain();
}

function startAgain() {
    console.log(i); // <-- no variable `i` found in its scope, so let's find some in the global scope.
    // looks like it found one; with a value of `0`
}

start();
这将输出1

更新

您的计算错误,您正在添加指向运行状况的函数指针

在这里:

应该是:

player.Health +=  player.healsRandom();

对player.attackDamage和object.attackDamage执行同样的操作来回答您的特定问题:您想要的player对象是startName的局部变量,因此startCombat没有定义。你有两个不同的玩家变量,它会检查你的全局玩家变量上没有Wins属性的Wins属性。如果你需要帮助,你可以在这里发布代码,因为我在startCombat中创建了var玩家和var对手。但它仍然产生了这个错误:蝙蝠侠已经离开了。全能的格兰特已经离开了。执行此解决方案:在初始化玩家和对手时,删除StartName中的两个var关键字,这应该会起作用。好的,从对手和玩家中删除var关键字,这两个关键字现在都在startCombat函数中,它仍然会给我相同的错误。谢谢!!我今天刚刚学习了对象和方法,所以我完全忘记了括号。谢谢,谢谢
function start() {
    i = 1; // <-- JavaScript tries to find `i`
    // <-- it founds none, well, let's make this a `global scope` variable
    startAgain();
}

function startAgain() {
    console.log(i);
}
player.Health +=  player.healsRandom;
player.Health +=  player.healsRandom();