使用eval声明的动态数组在其他函数访问时报未定义如何解决
错误原因
问题核心是变量作用域导致的:
你在第一个函数里通过eval配合var声明的变量,属于whengetanswerfrominput的函数局部作用域,当这个函数执行完毕后,该局部变量就会被垃圾回收,第二个函数运行时自然找不到对应的变量,就会抛出未定义错误。
解决方案
方案1:调整变量作用域(仅本地测试可用,不推荐)
将动态创建的变量挂载到全局window对象上,即可跨函数访问,修改第一个函数的逻辑即可:
function whengetanswerfrominput() { var answer = document.getElementById("input").value; // 去掉var,直接将变量挂载到全局window对象 eval(answer + " = ['bla','bla'];"); }
警告:该方案保留了
eval的使用,存在极高安全风险,用户如果输入恶意代码会直接执行,绝对不能用于线上生产环境。
方案2:使用对象承接动态键(推荐,生产环境可用)
完全弃用eval,用一个全局的普通对象存储所有动态创建的数组,键名对应用户输入的内容,既安全又能实现需求:
// 提前声明全局承接对象,所有动态数组都存在该对象下 const dynamicArrays = {}; function whengetanswerfrominput() { const answer = document.getElementById("input").value; // 直接给对象添加动态属性,不需要eval dynamicArrays[answer] = ['bla','bla']; } function whenclickotherbutton() { const answer = document.getElementById("input").value; // 先判断数组是否存在,避免报错 if (Array.isArray(dynamicArrays[answer])) { dynamicArrays[answer].push('bla'); } else { console.warn(`名为${answer}的数组不存在`); } }
该方案的优势:
- 完全规避了
eval的安全隐患 - 所有动态创建的数组都统一管理,不会污染全局作用域
- 支持提前做存在性判断,避免出现未定义报错
提示:如果用于线上环境,建议对用户输入的
answer内容做合法性校验,限制仅允许使用字母、数字、下划线等安全字符,避免出现异常键名。
内容的提问来源于stack exchange,提问作者User1548789
相关产品推荐
相关产品推荐

