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

JavaScript:调用eval前如何检查字符串是否为有效函数名?

如何在调用eval前检查字符串是否为有效函数名

当然可以!既然你已经清楚eval()的风险,且这个需求用于私有项目,那咱们可以用几种实用的方法来提前校验字符串是否为有效函数名,避免不必要的执行风险。

方法1:检查全局作用域中的函数

如果你的目标函数是挂载在全局作用域(比如浏览器的window对象)上的,可以直接通过对象属性访问的方式判断它是否为函数:

var fnString = $('#fnInput').val();
// 检查是否为全局函数
if (typeof window[fnString] === 'function') {
  // 确认有效后再执行——这里完全不需要用eval,直接调用更安全!
  window[fnString]();
} else {
  console.log('不是有效的全局函数名');
}

小提示:用window[fnString]()替代eval(fnString + '()'),既能达到调用目的,又比eval更安全可控。

方法2:检查局部/自定义作用域的函数

如果你的函数是定义在某个局部作用域或者自定义对象里的,比如维护了一个预先定义的函数集合,这种方式风险最低:

// 自定义函数集合:只允许调用这些预先定义好的函数
const myFunctions = {
  greet: function() { alert('Hello!') },
  calculate: function() { return 1 + 1 }
};

var fnString = $('#fnInput').val();
// 检查是否在自定义集合中且为函数
if (myFunctions.hasOwnProperty(fnString) && typeof myFunctions[fnString] === 'function') {
  myFunctions[fnString]();
} else {
  console.log('不是有效的函数名');
}

方法3:正则匹配合法标识符(辅助校验)

JavaScript的函数名必须符合标识符规则:以字母、下划线_或美元符$开头,后续可以是字母、数字、下划线或美元符。可以先用正则过滤掉明显非法的字符串,再结合前面的类型检查:

var fnString = $('#fnInput').val();
// 匹配合法标识符的正则
const validIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;

if (validIdentifier.test(fnString)) {
  // 再进一步检查是否为有效函数
  if (typeof window[fnString] === 'function') {
    window[fnString]();
  } else {
    console.log('字符串格式合法,但不是有效函数');
  }
} else {
  console.log('不是合法的函数名格式');
}

这个正则可以先过滤掉像123func、func!@#这类明显非法的字符串,减少后续检查的无效操作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:04:02