已知类名如何获取对应class对象?JavaScript不使用eval的实现方法
问题原因说明
你遇到的访问差异是ES规范的明确规定:
- 全局作用域下的
function声明(非严格模式)会自动挂载为globalThis的属性,所以你可以通过globalThis.myfn直接访问 - 全局作用域下的
class、let、const声明只会存入全局词法环境,不会成为globalThis的属性,所以用之前拿函数的方法访问不到
替代实现方案
方案1:可修改eval执行的代码时优先选择
- 主动挂载到全局对象
把eval执行的代码改成class myclass {}; globalThis.myclass = myclass;,之后直接用globalThis.myclass就能拿到类对象,这是最稳妥的方案。 - 直接接收eval的返回值
class声明作为eval执行的表达式时,返回值就是类本身,你直接接住返回值即可,不需要后续按名称查找:const myClass = eval('class myclass {}');
方案2:无法修改eval代码、且已经提前执行过class声明
这种场景可以用new Function替代eval,安全性远高于直接调用eval:
const myClass = new Function('return myclass')();
new Function生成的函数只会在全局作用域运行,不会读取/修改你当前的局部作用域变量,规避了eval的绝大多数安全风险。
内容的提问来源于stack exchange,提问作者user1343035
相关产品推荐
相关产品推荐

