JS中如何通过window[]方式用字符串调用嵌套函数
如何仅使用字符串调用嵌套挂载的函数
首先明确window["oot.inn"]("4")失效的核心原因:JavaScript的方括号属性访问语法,只会查找和传入字符串完全匹配的属性名,不会自动识别.做层级遍历。window对象上本身不存在名为"oot.inn"的属性,自然会抛出找不到函数的错误。
你给出的分层访问写法是正确的基础实现:
function oot(wha) { function inn(wha) { First.innerHTML += "Inner [" + wha + "]"; } oot.inn = inn; Second.innerHTML += "Outer [" + wha + "]"; } oot("1"); oot.inn("2"); // 运行正常 window["oot"]("3"); // 运行正常 // window["oot.inn"]("4"); // 失效:window无"oot.inn"属性 window["oot"]["inn"]("4"); // 运行正常
如果必须使用单个完整字符串完成调用,可以用以下两种方案实现:
方案1:通用路径解析调用(生产环境推荐)
写一个简单的路径解析工具,自动按.拆分字符串为属性路径,从全局对象逐层向下查找目标函数后执行,无安全风险:
function callByStrPath(path, ...args) { const props = path.split('.'); let current = window; for (const prop of props) { current = current[prop]; if (current == null) { throw new Error(`路径 ${path} 无效,未找到属性 ${prop}`); } } return current(...args); } // 直接传入单字符串即可调用 callByStrPath("oot.inn", "4"); // 等效于执行 oot.inn("4")
这个方案兼容任意层级的嵌套函数/对象方法,比如callByStrPath("a.b.c.d", params)就可以调用window.a.b.c.d(params)。
方案2:eval直接执行(仅可用于可信场景)
如果是内部调试场景,传入的字符串完全可控、不存在被用户篡改的可能,可以直接用eval拼接执行语句:
// 安全警告:eval会执行任意传入的JS代码,绝对不能用来处理用户输入、第三方返回的不可信字符串,否则会引发严重XSS漏洞 const funcPath = "oot.inn"; eval(`${funcPath}("4")`);
注意:生产环境除非有非常特殊的场景,否则永远优先选择方案1,不要用eval处理动态路径。
内容的提问来源于stack exchange,提问作者jobeSW
相关产品推荐
相关产品推荐

