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

