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

JavaScript中能否通过其他变量拼接生成动态变量名?

动态生成变量名的可行方案

嘿,我懂你想通过拼接现有变量来生成新变量名的需求——虽然你也清楚用数组或对象管理这类变量更合理,但还是想搞清楚有没有办法实现对吧?

首先得说:你尝试的let score_(${p1})_upper_row1;这种写法是不合法的,JavaScript里不能直接用模板字面量来声明变量名,语法上根本通不过。不过我们可以换个思路,用对象属性来模拟这种“动态命名”的效果,既避开了eval的风险,也能达到你想要的目的。

推荐方案:用对象存储(安全易维护)

用一个对象来集中管理所有分数相关的“动态变量”,本质是把你想要的变量名作为对象的属性名,这样既灵活又不会污染全局作用域:

let p1 = "player1";
let p2 = "player2";
let activePlayer = p2; // 注意你原代码里写的是activePlayers,应该是笔误~

// 创建一个专门存储分数的对象
const scores = {};

if (activePlayer === p1) {
  // 用模板字面量作为属性名,动态赋值
  scores[`score_${p1}_upper_row1`] = 0; // 可以根据需求初始化值,比如0
  scores[`score_${p1}_upper_row2`] = 0;
  scores[`score_${p1}_upper_row3`] = 0;
} else if (activePlayer === p2) {
  scores[`score_${p2}_upper_row1`] = 0;
  scores[`score_${p2}_upper_row2`] = 0;
  scores[`score_${p2}_upper_row3`] = 0;
}

// 访问时同样用模板字面量或者直接写属性名
console.log("当前玩家的第一行分数:", scores[`score_${activePlayer}_upper_row1`]);
// 也可以这样访问:scores.score_player2_upper_row1

这样生成的属性名完全符合你的预期:当activePlayer是player1时,对象里就有score_player1_upper_row1这类属性;切换到player2时则对应生成player2的属性。

不推荐但可行:用window对象(仅浏览器环境)

如果你是在浏览器环境下,也可以利用window对象来创建全局变量,但这种方法会污染全局作用域,容易引发命名冲突,所以非常不推荐:

let p1 = "player1";
let p2 = "player2";
let activePlayer = p2;

if (activePlayer === p1) {
  window[`score_${p1}_upper_row1`] = 0;
  window[`score_${p1}_upper_row2`] = 0;
  window[`score_${p1}_upper_row3`] = 0;
} else if (activePlayer === p2) {
  window[`score_${p2}_upper_row1`] = 0;
  window[`score_${p2}_upper_row2`] = 0;
  window[`score_${p2}_upper_row3`] = 0;
}

// 此时可以直接作为全局变量访问
console.log(score_player2_upper_row1);

最后再啰嗦一句

虽然上面的方法能实现你想要的“动态生成变量名”效果,但本质上都是用对象属性来模拟的——JavaScript本身并不支持直接通过模板字面量声明变量名。而且还是强烈建议用对象(甚至嵌套对象)来管理这类变量,比如可以把每个玩家的分数单独分组:scores.player1.upper.row1,这样代码可读性和维护性会高很多~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:17:43