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

