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
相关产品推荐
相关产品推荐

