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

JavaScript中如何结合变量与字符串构建动态变量并更新?

嘿,我来帮你把这个问题掰明白,顺便把你找到的可行方案里的细节讲清楚~

问题回顾

你一开始定义了四个全局变量:

var player1InitStart = 0;
var player2InitStart = 0;
var player3InitStart = 0;
var player4InitStart = 0;

然后通过event.target.id拿到player1/player2/player3/player4这样的playerID,想要把它和字符串"InitStart"拼接,定位并更新对应的变量。你试过eval()、方括号等方法,最后找到了可行方案,但不清楚里面的$和反引号 的作用。

你的可行方案细节解释

先把你的代码贴出来:

var playerID = event.target.getIframe().id;
var targetInitID = `${playerID}InitStart` ;
alert(window[targetInitID]);
window[targetInitID] = 1;

这里的核心是ES6引入的模板字符串和对象的方括号访问语法,我逐个解释:

  • **反引号()**:这是模板字符串的标识,和传统的单引号'、双引号"不同,它允许你在字符串里直接嵌入变量或表达式,不用再像以前那样用+`号拼接字符串,写起来更直观。
  • ${}:这是模板字符串里的“变量占位符”,它会把包裹在里面的变量或表达式的实际值解析出来,替换到字符串对应的位置。比如当playerID是"player2"时,${playerID}InitStart就会变成"player2InitStart",和你手动写playerID + "InitStart"效果一样,但可读性高很多。
  • window[targetInitID]:因为你定义的playerXInitStart是全局变量,在浏览器环境中,全局变量会自动挂载到window对象上成为它的属性。用方括号语法window[属性名]可以动态访问对象的属性,这比eval()安全太多——eval()会执行任意传入的代码,存在安全隐患,而方括号只是单纯访问对象属性,完全没有风险。
更规范的写法建议

其实把这些分散的变量放到一个统一的对象里会更优雅,还能避免污染全局作用域,比如:

// 用一个对象集中管理所有玩家的初始化值
const playerInitStates = {
  player1InitStart: 0,
  player2InitStart: 0,
  player3InitStart: 0,
  player4InitStart: 0
};

// 更新时直接通过拼接后的key访问
const playerID = event.target.getIframe().id;
const targetKey = `${playerID}InitStart`;
playerInitStates[targetKey] = 1;
console.log(playerInitStates[targetKey]); // 输出1

如果愿意再优化一步,甚至可以把对象的key简化成player1、player2,这样连拼接都省了:

const playerInitStates = {
  player1: 0,
  player2: 0,
  player3: 0,
  player4: 0
};

const playerID = event.target.getIframe().id;
playerInitStates[playerID] = 1;

这样代码更简洁,维护起来也更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:30:32