javascript - 其他函数调用函数不起作用
问题描述
我正在尝试使计算机与人类玩家的石头剪刀布比赛。我的函数computerplay();
可以从三个可能的字符串(“Rock”、“Paper”、“Scissors”)中生成随机值作为游戏匹配值的计算机选择。使用第三个函数save();
,我允许玩家将他的选择输入 HTML 表单并尝试将其保存到 round(); 功能。
作为结果,我希望变量 c 或 p 递增或打印字符串“draw”作为指示,以round();
获得存储在 x 中的计算机选择和作为变量 player 的玩家选择。似乎 x 和 player 都附加了它们的值,但round();
函数没有收到它。感谢您帮助解决它。
function computerPlay() {
const number = Math.floor(Math.random() * 1000);
if (number % 3 === 0) {
return 'Rock';
}
if (number % 3 === 1) {
return 'Paper';
}
return 'Scissors';
}
var p = 0;
var c = 0;
var x = computerPlay();
var player;
player = document.getElementById("player").value;
document.write(x);
function round ( playerSelection = player, computerSelection = x ) {
document.write(player);
document.write(x);
if (playerSelection == 'Rock' && computerSelection == 'Rock') {
document.write (p);
document.write (c);
document.write("draw");
}
else if (playerSelection == 'Rock' && computerSelection == 'Paper') {
c++;
document.write (p);
document.write (c);
document.write("comp");
}
else if (playerSelection == 'Rock' && computerSelection == 'Scissors') {
p++;
document.write (p);
document.write (c);
document.write("player");
}
else if (playerSelection == 'Scissors' && computerSelection == 'Rock') {
c++;
document.write (p);
document.write (c);
document.write("comp");
}
else if (playerSelection == 'Scissors' && computerSelection == 'Paper') {
p++;
document.write (p);
document.write (c);
document.write("player");
}
else if (playerSelection == 'Scissors' && computerSelection == 'Scissors') {
document.write (p);
document.write (c);
document.write("draw");
}
else if (playerSelection == 'Paper' && computerSelection == 'Rock') {
p++;
document.write (p);
document.write (c);
document.write("player");
}
else if (playerSelection == 'Paper' && computerSelection == 'Scissors') {
c++;
document.write (p);
document.write (c);
document.write("computer");
}
else if (playerSelection == 'Paper' && computerSelection == 'Paper') {
document.write (p);
document.write (c);
document.write("draw");
}
}
function save() {
var player;
player = document.getElementById("player").value;
document.write (player);
document.write(x);
computerPlay();
var x = computerPlay();
round();
}
document.write (p);
document.write (c);
if ( c == 5 ) {
document.write (c);
document.write ('computer win');
}
else if ( p == 5 ) {
document.write ('player win');
}
<p id="demo"></p>
<form id="form">
<input id="player" type="text" min="1" name="player">
<button type="button" onclick="save();">Get Value</button>
</form>
解决方案
在您的脚本中,您使用了两个都称为 的变量player
,其中一个:
var x = computerPlay();
var player;
player = document.getElementById("player").value;
还有一个:
function save() {
var player;
player = document.getElementById("player").value;
第一个变量在脚本主体中声明,这意味着它具有“全局范围”。相反,您在内部定义的那个save()
具有“函数范围”(这意味着它对同一函数主体之外的任何人都不可见)。
由于您在round()
没有参数的情况下调用,它将使用它们的默认值初始化它们,从函数声明发生的范围(在本例中为全局范围)中获取这些值。由于 globalplayer
最初是空的,并且您永远不会更改该变量,因此 round 将始终将其第一个参数作为空字符串。有很多方法可以“解决”这个问题:
直接在里面获取变量
round()
:function round(/* ... */) { player = document.get...
实际上将参数传递给函数:
round(player);
更新 player 变量的值而不是创建一个新变量:
var player; function save() { player = document.get... round(); }
有关 JavaScript 范围规则的更多信息,请阅读此处
推荐阅读
- php - PHP:在运行查询之前首先收集所有错误
- node.js - 如何在 Heroku 应用程序中设置环境变量
- android - ConstraintLayout 中的 ListView 在预览中展开为全屏
- c# - Outlook shows save confirmation dialog (message lose digital signature in case of saving) in Application.ItemSend event handler
- python - Input statements just keep going in a loop
- node.js - yauzl callback parameter is undefined in one computer, works fine in another
- python - 通过 HTTP 提供图像时损坏的图像
- hybris - 如何在 hybris 中为 OAuth2 响应设置会话超时
- vba - 在定义段落的表中查找字符串的宏
- c# - 主线程结束后如何保持任务运行?