能否通过存储变量名的字符串获取对应同名变量的取值
字符串匹配同名变量取值的实操方案
结合你做宝可梦风格游戏的技能管理场景,按实际项目里的推荐优先级排序:
方案1:统一对象字典存储(全环境兼容,最适合游戏项目)
别零散声明一堆独立的全局变量,把所有技能的关联配置统一存在一个对象里,用技能名当对象的键,通过键名读对应值,没有环境兼容问题,后期管理技能也省心:
// 统一技能数据库,所有技能的伤害、属性、动画、特效配置都存在这里 const SkillLib = { // 键名和你存的技能字符串完全一致,值就是对应技能的实际配置 Tackle: { power: 40, element: 'normal', animation: 'tackle_anim', extraEffect: null }, ThunderShock: { power: 40, element: 'electric', animation: 'thunder_anim', extraEffect: '30%概率麻痹' } } // 存当前技能名的字符串变量 const Move = 'Tackle'; // 直接用方括号语法读对应技能的完整配置 const currentMoveConfig = SkillLib[Move];
- 好处:不会把变量散得到处都是污染全局作用域,不管是浏览器、Node后端、微信/抖音这类小游戏平台,代码都能正常跑;后期新增技能、调整数值直接在SkillLib里加对应键值对就行,不用改零散的变量声明逻辑。
方案2:非严格浏览器环境的临时读取写法
如果已经写了大量零散的全局var变量,在非严格模式的普通浏览器页面里,var声明的全局变量会自动挂到window全局对象上,可以直接通过window按字符串名取值:
// 之前零散声明的全局变量 var Tackle = { power: 40 }; const Move = 'Tackle'; // 从全局对象按字符串名读对应变量 const currentMoveConfig = window[Move];
- 踩坑提醒:这种写法局限性特别大,严格模式、ES模块环境、各类小游戏环境、Node.js里,var声明的变量不会挂到全局对象上,直接就会读失败;要是变量名刚好和window自带的内置属性重名,还会出那种查半天都找不到原因的隐蔽bug,不适合长期迭代的游戏项目用。
绝对别碰的踩坑写法
别用eval(Move)这种方式取值:一来现在大部分前端项目、游戏引擎开了CSP安全策略之后,eval会直接被拦截禁用;二来eval有潜在的安全风险,运行性能也差,完全是给自己的项目埋雷,没有任何实际优势。
内容的提问来源于stack exchange,提问作者PikachuPlays
相关产品推荐
相关产品推荐

