Javascript TypeError:无法读取未定义的属性“Wins”?
我已经得到了对象,并且我已经正确地调用了它们,但是我不断地得到这些错误。有人知道为什么吗?它说玩家对象的“胜利”没有定义,但很明显是这样的 这就是我给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; } };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
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();