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

JavaScript中prompt赋值后变量显示undefined问题排查

为什么调用getPlayerNames后player变量显示undefined?

嘿,我来帮你搞定这个问题——你遇到的undefined问题,核心是JavaScript的参数传递逻辑和函数返回值的处理不当,咱们拆成两点说:

原因1:JavaScript基本类型是按值传递的

你把player1Name这些变量传给函数的时候,其实只是把它们当前的初始值(也就是undefined)复制了一份给函数里的p1、p2等参数。函数内部执行p1 = prompt(...)的时候,只是修改了这个副本变量,完全不会影响到外面的player1Name。打个比方,就像你把自己的作业复印了一份给朋友,朋友在复印件上改字,你的原作业根本不会变。

原因2:函数没有返回获取到的名字

你的getPlayerNames最后写了return;,这相当于返回了undefined。就算你在函数里给p1-p4都赋了值,也没把这些值传递回调用的地方,外面的变量自然拿不到任何内容。

解决方案

这里给你两种靠谱的写法,推荐第一种,更符合代码封装的最佳实践:

方案1:让函数返回包含名字的对象

把获取到的名字打包成对象返回,外面用解构赋值接收,这样变量就能拿到正确的值了:

function getPlayerNames() {
  const p1 = prompt("What is Player 1's name?", '');
  const p2 = prompt("What is Player 2's name?", '');
  const p3 = prompt("What is Player 3's name?", '');
  const p4 = prompt("What is Player 4's name?", '');
  // 返回包含所有名字的对象
  return { p1, p2, p3, p4 };
}

// 解构赋值,把返回的对象属性赋值给对应的变量
const { 
  p1: player1Name, 
  p2: player2Name, 
  p3: player3Name, 
  p4: player4Name 
} = getPlayerNames();

方案2:直接修改全局变量(不推荐,适合小型项目)

如果你的变量是全局作用域的,可以直接在函数里修改它们,这样就不用传参数也不用返回值了,但这种方式容易引发全局变量污染,尽量少用:

// 全局变量声明
let player1Name, player2Name, player3Name, player4Name;

function getPlayerNames() {
  // 直接修改全局变量
  player1Name = prompt("What is Player 1's name?", '');
  player2Name = prompt("What is Player 2's name?", '');
  player3Name = prompt("What is Player 3's name?", '');
  player4Name = prompt("What is Player 4's name?", '');
}

getPlayerNames();

内容的提问来源于stack exchange,提问作者John V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:03:30