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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:51:20