JavaScript技术问询:能否使用生成的名称命名变量?
JavaScript中使用动态生成的名称创建变量的方法
首先得说,你的示例代码里的eval用法其实没达到预期效果——你先执行了x = eval("block_" + coordinates_x + "_" + coordinates_y),这时候如果block_1_1还没定义会直接报错,之后的var x = 0又会把x覆盖成0,根本没创建出block_1_1变量。下面给你讲几种正确的实现方式:
1. 利用全局对象(浏览器环境)
在浏览器里,全局变量本质是window对象的属性,所以你可以通过动态属性名的方式创建变量:
const coordinates_x = 1; const coordinates_y = 1; // 动态创建名为block_1_1的全局变量 window[`block_${coordinates_x}_${coordinates_y}`] = 0; // 之后就能直接访问block_1_1了 console.log(block_1_1); // 输出0
不过这种方式会污染全局作用域,容易和其他脚本的变量冲突,除非必要不建议用。
2. 使用自定义对象(推荐方案)
更好的做法是自己创建一个容器对象,把动态命名的变量作为对象的属性存储,既安全又方便管理:
const coordinates_x = 1; const coordinates_y = 1; // 创建一个专门的容器来存放这些动态变量 const blocks = {}; // 动态添加属性 blocks[`block_${coordinates_x}_${coordinates_y}`] = 0; // 访问的时候可以用两种方式 console.log(blocks.block_1_1); // 输出0 // 或者继续用动态语法 console.log(blocks[`block_${coordinates_x}_${coordinates_y}`]); // 输出0
这种方式不会污染全局作用域,还能统一管理所有类似block_x_y的变量,后期维护也更轻松。
3. 关于eval的注意事项
你示例里用到了eval,虽然理论上可以用它来创建动态变量:
const coordinates_x = 1; const coordinates_y = 1; eval(`var block_${coordinates_x}_${coordinates_y} = 0;`); console.log(block_1_1); // 输出0
但非常不推荐这种方式:eval会执行传入的任意代码,存在安全风险(如果动态内容来自用户输入,很容易被注入恶意代码),而且会影响JavaScript引擎的性能优化,代码可读性也差。
总结一下,优先用自定义对象来存储动态命名的变量,既安全又清晰。
内容的提问来源于stack exchange,提问作者Edgar Galustian
相关产品推荐
相关产品推荐

