You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript石头剪刀布游戏函数带参数调用失效问题咨询

石头剪刀布游戏函数参数问题解答

问题根源:变量遮蔽(Variable Shadowing)

你遇到的问题核心是函数参数遮蔽了全局变量:

  • 你在全局作用域已经定义了playerSelection和compSelection两个变量,并且通过prompt和立即执行函数给它们赋了值
  • 但你给singleround函数声明了同名的参数,这会导致函数内部优先使用参数变量,而不是全局的同名变量
  • 现在你的singleround是立即执行函数(IIFE),你没有给它传递任何参数,所以函数内部的playerSelection和compSelection都是undefined——两个undefined相等,自然触发平局提示
  • 当你去掉函数的参数时,函数内部会自动向上查找全局作用域的同名变量,所以逻辑恢复正常

两种修正方案

方案1:去掉函数参数,直接使用全局变量

适合简单的单轮游戏场景,直接移除函数的参数声明,让函数使用全局的变量:

(function singleround() {
  // 原函数内的判断逻辑完全不变
  if (playerSelection === "rock" && compSelection === "paper") {
    console.log("Oh No! You lost, Paper beats Rock :(");
  } else if (playerSelection === "rock" && compSelection === "scissors") {
    console.log("Well done! You won, Rock beats Scissors!");
  } else if (playerSelection === "paper" && compSelection === "rock") {
    console.log("Well done! You won, Paper beats Rock!");
  } else if (playerSelection === "paper" && compSelection === "scissors") {
    console.log("Oh No! You lost, Scissors beats Paper :(");
  } else if (playerSelection === "scissors" && compSelection === "rock") {
    console.log("Oh No! You lost, Rock beats Scissors :(");
  } else if (playerSelection === "scissors" && compSelection === "paper") {
    console.log("Well done! You won, Scissors beats Paper!");
  } else if (playerSelection === compSelection) {
    console.log("It's a tie! Try again.");
  } else {
    console.log("Uh Oh! Something's gone wrong. Refresh the page to try again!");
  }
})();

方案2:保留参数,改为普通函数并主动传参

如果后续要扩展多轮游戏,推荐这种方式,让函数更独立:

// 把立即执行函数改成普通函数
function singleround(playerSelection, compSelection) {
  // 原判断逻辑不变
  if (playerSelection === "rock" && compSelection === "paper") {
    console.log("Oh No! You lost, Paper beats Rock :(");
  } else if (playerSelection === "rock" && compSelection === "scissors") {
    console.log("Well done! You won, Rock beats Scissors!");
  } else if (playerSelection === "paper" && compSelection === "rock") {
    console.log("Well done! You won, Paper beats Rock!");
  } else if (playerSelection === "paper" && compSelection === "scissors") {
    console.log("Oh No! You lost, Scissors beats Paper :(");
  } else if (playerSelection === "scissors" && compSelection === "rock") {
    console.log("Oh No! You lost, Rock beats Scissors :(");
  } else if (playerSelection === "scissors" && compSelection === "paper") {
    console.log("Well done! You won, Scissors beats Paper!");
  } else if (playerSelection === compSelection) {
    console.log("It's a tie! Try again.");
  } else {
    console.log("Uh Oh! Something's gone wrong. Refresh the page to try again!");
  }
}

// 调用函数时传入全局变量
singleround(playerSelection, compSelection);

额外优化建议

你的getComputerChoice立即执行函数可以改成更清晰的普通函数,避免全局变量randomNumber的冗余:

function getComputerChoice() {
  const randomNumber = Math.floor(Math.random() * 3) + 1;
  if (randomNumber === 1) {
    return "rock";
  } else if (randomNumber === 2) {
    return "paper";
  }
  return "scissors";
}

// 直接赋值给compSelection
const compSelection = getComputerChoice();

内容的提问来源于stack exchange,提问作者Guépardeau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:02:48