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
相关产品推荐
相关产品推荐

