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

如何不使用eval()从字符串数组创建JavaScript变量

不用eval()动态创建Leaflet图层的解决方案

你遇到的问题本质是动态创建变量时错误使用了独立作用域的函数:new Function()创建的函数有自己的局部作用域,里面定义的let变量无法在外部访问——哪怕你没看到layerHomes报错,它其实也没在你预期的作用域里存在,只是你没用到它而已。

正确的做法是用对象集中管理这些图层,既避免作用域污染,又能灵活动态创建和访问:

实现代码

// 1. 创建一个对象存储所有图层
const layers = {};
const array = ['Homes', 'Businesses', 'Parks'];

array.forEach((name) => {
    // 2. 动态给对象添加属性,存储图层实例
    layers[`layer${name}`] = L.layerGroup().addTo(map);
    layers[`layer${name}Polylines`] = L.layerGroup().addTo(map);
});

访问图层

后续可通过对象属性直接访问对应的图层:

// 直接访问
layers.layerHomes.addLayer(yourHomeMarker);
layers.layerHomesPolylines.addLayer(yourHomePolyline);

// 动态场景下方括号语法
const targetType = 'Homes';
layers[`layer${targetType}`].remove();

为什么这比eval/Function更合适?

  • 作用域可控:所有图层集中在layers对象中,不会污染全局或局部作用域,避免变量名冲突
  • 安全可靠:规避eval()带来的代码注入风险,也解决了Function()的作用域隔离问题
  • 易于维护:统一管理所有图层,后续修改、遍历或销毁操作更便捷

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:20:42