1281

我将JavaScript中的函数名作为字符串。如何将其转换为函数指针,以便稍后调用它?

根据具体情况,我可能还需要向方法中传递各种参数。

某些功能可以采用以下形式namespace.namespace.function(args[…]).

0

37个答案37

重置为默认值
1664

不要使用评估除非你绝对的,肯定的别无选择。

如前所述,使用这样的方法是最好的方法:

窗口[“functionName”](参数);

然而,这不适用于命名空间函数:

窗口[“My.Namespace.functionName”](参数);//失败

这就是你要做的:

window[“My”][“Namespace”][“functionName”](参数);//成功

为了让这更容易并提供一些灵活性,这里有一个方便功能:

函数executeFunctionByName(functionName,context/*,args*/){var args=Array.prototype.slice.call(参数,2);var namespaces=functionName.split(“.”);var func=命名空间.pop();for(var i=0;i<namespaces.length;i++){context=context[namespaces[i]];}return context[func].apply(context,args);}

你可以这样称呼它:

executeFunctionByName(“My.Namespace.functionName”,窗口,参数);

注意,您可以在任何上下文中传递,因此这与上面的操作相同:

executeFunctionByName(“Namespace.functionName”,My,参数);
33
  • 5
    你知道你不需要整个“func”结构吗?只需“context.apply”即可 评论 2008年12月11日16:36
  • 23
    当然,我知道这一点,但我编写函数的方式为那些阅读它的人提供了一些清晰的信息,他们可能无法完全理解发生了什么。我编写了这个函数,意识到人们阅读它可能需要一些帮助。不过我会提供一个替代方案,因为你问。。。 评论 2008年12月11日16:50
  • 131
    擦掉它——代码足够清晰,知道的人也知道。如果你像我一样,并且知道自己在做什么,那么如果你使用这段代码,你可以自己做这样的更改。堆栈溢出是为了教育其他人,我认为我的代码对新手来说更容易理解。不过谢谢! 评论 2008年12月11日17:21
  • 4
    是否存在窗口[“funcName”]返回未定义的情况?这就是我目前面临的问题。调用代码和函数在两个单独的js文件中定义。我尝试将它们添加到同一个文件中,但没有任何区别。
    – 代码猴
    评论 2010年3月16日11:19
  • 6
    我认为这里有一个问题。当你打电话时My.Namespace.functionName(),将引用My.Namespace(我的命名空间)对象。但是当你打电话的时候executeFunctionByName(“My.Namespace.functionName”,窗口),没有办法指的是同一件事。也许它应该使用最后一个名称空间作为范围,或者窗口如果没有名称空间。或者您可以允许用户将范围指定为参数。 评论 2011年7月6日23:08
114

我只是想发布一个稍微修改过的版本Jason Bunting的功能非常有用.

首先,我通过向提供第二个参数简化了第一条语句切片()。原始版本在除IE之外的所有浏览器中都运行良好。

第二,我已经更换了具有上下文在返回语句中;否则,总是指向窗口执行目标函数时。

函数executeFunctionByName(functionName,context/*,args*/){var args=Array.prototype.slice.call(参数,2);var namespaces=functionName.split(“.”);var func=命名空间.pop();for(var i=0;i<namespaces.length;i++){context=context[namespaces[i]];}return context[func].apply(context,args);}
  • 没有检查“functionName”是否实际存在? 评论 2016年11月2日1:08
  • 我认为Mac的回答被低估了。我不是专家,但它似乎经过深思熟虑并且很强大。 评论 2017年3月9日21:23
  • 你也可以返回上下文[func];并让调用方传递参数:getFuncByName(函数名,上下文)(arg1,arg2)所以它将使用与eval相同的定义
    – 奥姆
    评论 2023年8月18日19:24
86

另一个问题的答案向您展示了如何做到这一点:相当于Python的locals()的Javascript?

基本上,你可以说

窗口[“foo”](arg1,arg2);

或者正如许多其他人所建议的那样,您可以只使用eval:

eval(fname)(arg1,arg2);

尽管除非你完全确定自己在评估什么,否则这是非常不安全的。

5
  • 8
    第一种形式更可取 评论 2008年12月11日15:54
  • 28
    只有当所有其他方法都失败时,才使用eval作为最后手段。 评论 2008年12月11日15:58
  • 2
    它是……但它能与这样的函数一起使用吗:x.y.z(args)?
    – 基隆
    评论 2008年12月11日15:58
  • @基隆:是的。请看下面我的答案 评论 2008年12月11日16:02
  • 1
    这个窗口在像Node这样的服务器上下文中,该选项根本不起作用。在这种情况下评估可能是最好、最快的选择。 评论 2023年8月23日1:07
86

我认为这样做的一种优雅方式是在散列对象中定义函数。然后可以使用字符串从散列中引用这些函数。例如。

var自定义对象={customFunction:函数(param){…}};

然后您可以拨打:

自定义对象['customFunction'](参数);

其中customFunction将是与对象中定义的函数匹配的字符串。

更新

似乎这个答案对许多其他的编码人员很有帮助,所以这里有一个更新的版本。

使用ES6,您可以另外使用计算的属性名称这会让你避免使用魔术弦。

const FunctionNames=对象.freeze({FirstFunction:“FirstFunction”,第二功能:“第二功能”});...var自定义对象={[FunctionNames.FirstFunction]:函数(param){…},[FunctionNames.SecondFunction]:函数(param){…}};...customObject[FunctionNames.FirstFunction](参数);

  • @伊布森夫,谢谢你的评论,帮助我确定这是最好的回应。我创建了一个函数对象数组,然后使用它来创建一个deferred.promises数组。我在下面放了一些示例代码。(我不想创建新回复鲁本的回应。) 评论 2016年1月8日16:55
  • 函数getMyData(arrayOfObjectsWithIds){var functionArray=arrayUfObjectswithIds.map(函数(值){return{myGetDataFunction:MyService.getMyData(值.id)};})var promises=functionArray.map(function(getDataFunction){var deferred=$q.defer();getDataFuction.myGetDataFunction.success(functon(data){deferred.resolve(data)}))。error(函数(错误){deferred.rejection();});return deferred.promise;})$q.all(promises).then(function(dataArray){//do-stuff})}; 评论 2016年1月8日16:58
  • 这很好,我只添加了下划线/lodash来验证它是否是一个函数。然后跑 评论 2016年9月21日16:18
64

你能不能不这样做:

var codeToExecute=“My.Namespace.functionName()”;var tmpFunc=新函数(codeToExecute);tmpFunc();

您还可以使用此方法执行任何其他JavaScript。

10
  • 在函数传递偶数参数时有效 评论 2014年9月12日18:13
  • 1
    函数返回如何? 评论 2014年10月31日9:08
  • 13
    这与eval(“My.Namespace.functionName()”);? 评论 2015年4月21日0:36
  • 2
    @developerbmw,这是答案stackoverflow.com/questions/4599857/… 评论 2016年10月25日7:53
  • 2
    “不过,使用Function()构造函数不是一个好主意(它和eval()一样糟糕),因为代码是作为字符串传递和计算的。”——Javascript Patterns,Ch4,p.58
    – 多米赫
    评论 2019年11月18日7:46
62

使用ES6,您可以按名称访问类方法:

X类{方法1(){console.log(“1”);}方法2(){本[方法1]();console.log(“2”);}}设x=新x();x【方法2】();

输出将是:

12
7
  • 2
    最佳javascript纯粹…上帝。。删除类无效,但可以。谢谢! 评论 2016年6月3日13:51
  • 2
    这是我很久以来一直在寻找的东西。谢谢! 评论 2017年5月22日12:54
  • 1
    ES2015与此无关。您可以通过使用纯对象或原型委托来实现相同的目标对象.create()const myObj={method1(){console.log('1')},method2(){console.log('2')}}myObj['method1']();//1 myObj[“方法2”]();//2 评论 2018年10月26日2:54
  • 1
    这是金子!!!我很惊讶我以前从未想过这一点。很好!!! 评论 2019年8月19日1:39
  • 我也认为这是实现我们目标的最简洁的方式。 评论 2019年9月5日15:50
31

两件事:

  • 避免eval,它非常危险和缓慢

  • 其次,函数存在于何处并不重要,“全局性”与此无关。x.y.foo()可以通过启用x.y[“oo”]()x['y']['foo']()甚至是窗口['x]['y']['foo']()你可以这样无限期地连锁。

1
  • 1
    但您不能使用窗口['x.y.z']()来调用x.y.z()
    – 刻痕
    评论 2008年12月11日16:11
28

所有答案都假设可以通过全局范围(窗口)访问函数。然而,OP并没有做出这种假设。

如果函数位于本地作用域(也称为closure)中,并且没有被其他本地对象引用,那么运气不好:您必须使用评估()AFAIK,参见在javascript中动态调用本地函数

  • 5
    哥们儿(或杜德特),非常感谢你指出这一点!我想我快要疯了。
    – 功能0n
    评论 2014年3月16日3:13
  • 如果它在本地对象中,您可以执行以下操作:localobject['function_name'](),与window['function_name']()相同 评论 2021年11月28日9:55
  • 如果您仍然喜欢使用窗口的第一种方法。您可以通过定义窗口来访问本地函数。函数myLocalOwn(){};window.myLocalOwn=我的本地拥有;
    – 呻吟
    评论 2023年12月1日3:46
25

根据您所在的位置,您还可以使用:

此[“函数名”]();自我[“函数名”]();窗口[“函数名”]();顶部[“函数名”]();globalThis[“函数名”]();

或者,在nodejs中

全局[“函数名”]()
1
  • 谢谢你的回答函数callObjectMethod(obj,meth){return(_v)=>{obj[meth](_v)}}。对于我来说,这对于通过外部服务回调来调用带有参数的对象方法很有用。希望这能帮助其他人。 评论 2020年12月18日19:27
15

以下是我对杰森·本廷/亚历克斯·纳扎罗夫的出色回答的贡献,其中包括Crashalot要求的错误检查。

鉴于此(人为)序言:

a=函数(args){console.log('传递的全局函数:');for(var i=0;i<参数长度;i++){console.log(“->”+参数[i]);}};ns={};ns.a=函数(参数){console.log('传递的命名空间函数:');for(var i=0;i<参数长度;i++){console.log(“->”+参数[i]);}};名称='nsa';n_s_a=[‘斯诺登’];noSuchAgency=函数(){};

然后执行以下功能:

函数executeFunctionByName(functionName,context/*,args*/){变量args,命名空间,函数;if(typeof functionName===“undefined”){throw“未指定函数名”;}if(eval类型(functionName)!=='函数“){throw functionName+”不是函数“;}if(上下文类型!==“未定义”){if(typeofcontext==='object'和context-instanceofArray====false){if(typeof context[functionName]!==“function”){抛出上下文+'.'+functionName+“不是函数”;}args=Array.prototype.slice.call(参数,2);}其他{args=Array.prototype.slice.call(参数,1);context=窗口;}}其他{context=窗口;}namespaces=functionName.split(“.”);func=命名空间.pop();for(var i=0;i<namespaces.length;i++){context=context[namespaces[i]];}return context[func].apply(context,args);}

将允许您通过存储在字符串中的名称(名称空间或全局)调用javascript函数,无论是否有参数(包括Array对象),都可以对遇到的任何错误提供反馈(希望能够捕捉到它们)。

示例输出显示了其工作原理:

//调用不带参数的全局函数executeFunctionByName(“a”);/*输出:传递的全局函数:*///调用传递数字的全局函数(使用隐式窗口上下文)按名称执行功能('a',123);/*输出:传递的全局函数:-> 123*///调用不带参数的命名空间函数executeFunctionByName('ns.a');/*输出:传递的命名空间函数:*///调用命名空间函数传递字符串文本executeFunctionByName('ns.a','无此类代理!');/*输出:传递的命名空间函数:->没有这样的机构!*///调用命名空间函数,显式上下文作为单独的参数,传递字符串文本和数组executeFunctionByName('a',ns,'没有这样的代理!',[007,'是人']);/*输出:传递的命名空间函数:->没有这样的机构!->7,是那个男人吗*///调用传递字符串变量的全局函数(使用隐式窗口上下文)executeFunctionByName(“a”,名称);/*输出:传递的全局函数:->国家安全局*///通过字符串文字调用不存在的函数按名称执行功能('n_s_a');/*输出:未捕获的n_s_a不是函数*///通过字符串变量调用不存在的函数按名称执行功能(n_s_a);/*输出:Uncaught Snowden不是函数*///使用错误的命名空间引用调用现有函数executeFunctionByName('a',{});/*输出:Uncaught[object object].a不是函数*///不调用函数executeFunctionByName();/*输出:未指定未捕获的函数名*///通过空字符串调用executeFunctionByName(“”);/*输出:Uncaught不是函数*///使用命名空间引用调用现有全局函数按名称执行功能('noSuchAgency',ns);/*输出:Uncaught[object object]。noSuchAgency不是函数*/
4
  • 不知道。。。很明显,这是一个很好的努力。但我觉得“太宽泛了”。。。 评论 2017年3月29日9:33
  • 2
    嗯?SO是一个问答/教学平台。我很乐意提供我能想到的所有例子,希望能给大家带来启发。对我来说,这就是重点.
    – 雨衣
    评论 2017年12月8日18:18
  • 如果你在评估functionName,为什么不直接使用它呢?
    – 数据
    评论 2018年9月27日8:46
  • 这对我不起作用。我有一个命名空间函数a.b.c.d,其中d是函数名。调用executeFunctionByName(“a.b.c.d”,窗口)在检查的行上失败if(typeof context[functionName]!==“function”)因为context-window-是定义的,是一个对象和一个数组,但window['a.b.c.d']不存在,因为它在接受的答案中被确定为一个问题:window[“My.Namespace.functionName”](参数);//失败 评论 2019年5月9日12:39
14

只需通过以下方法将字符串转换为指针窗口[<方法名>].例子:

var function_name=“string”;函数名=窗口[函数名];

现在你可以像指针一样使用它了。

1
12

这是我的Es6方法,它使您能够以字符串或函数名的形式调用函数,还使您能够将不同数量的参数传递给不同类型的函数:

函数fnCall(fn,…args){让func=(类型fn==“字符串”)?窗口[fn]:fn;if(typeof func==“function”)func(…args);else throw new Error(`${fn}不是函数!`);}函数示例1(arg1){console.log(arg1,arg1)}函数示例2(arg1,arg2){console.log(arg1+“和”+arg2)}函数example3(){console.log(“没有参数!”)}fnCall(“example1”,“test_1”);fnCall(“example2”、“test_2”和“test3”);fnCall(示例3);fnCall(“示例4”);//应在控制台中引发错误

11

如果要使用窗口[“functionName”]你可以这样做;

var myObject=新对象();myObject[“functionName”](参数);

例子:

var now=新日期();现在[“getFullYear”]()
11

小心!!!

应尽量避免在JavaScript中通过字符串调用函数,原因有二:

原因1:一些代码模糊处理程序会破坏代码,因为它们会更改函数名,使字符串无效。

原因2:维护使用这种方法的代码要困难得多,因为很难定位字符串调用的方法的用法。

1
  • 您的答案说服了我不要在答案之间滚动,而是放弃使用函数名作为字符串调用函数的想法,谢谢您,先生。 评论 2022年5月16日12:50
10

我认为您不需要复杂的中间函数或eval,也不需要依赖窗口等全局变量:

函数fun1(arg){控制台.log(arg);}函数fun2(arg){控制台.log(arg);}常量操作={功能1,娱乐2};操作[“fun1”](“Hello World”);operations.fun2(“Hello World”);//如果愿意,可以使用中间变量设temp=“fun1”;操作[temp](“Hello World”);

它还将与导入的函数一起工作:

//模式.js导出函数fun1(arg){控制台.log(arg);}导出函数fun2(arg){控制台.log(arg);}
//索引.js从“./mod”导入{fun1,fun2};常量操作={功能1,娱乐2};操作[“fun1”](“Hello World”);操作[“fun2”](“Hello World”);

由于它使用的是属性访问,所以它将在最小化或模糊处理后幸存下来,这与您在这里找到的一些答案相反。

7

很惊讶看到没有提到setTimeout。

要运行不带参数的函数,请执行以下操作:

var functionWithoutArguments=函数(){console.log(“Executing function WithoutArguments”);}setTimeout(“functionWithoutArguments()”,0);

要运行带参数的函数,请执行以下操作:

var functionWithArguments=函数(arg1,arg2){console.log(“Executing function With Arguments”,arg1,arg2);}setTimeout(“functionWithArguments(10,20)”);

要运行深度命名空间函数,请执行以下操作:

var非常={_深深地:{_定义:{_函数:函数(num1,num2){console.log(“Execution_very_deeply _defined_function:”,num1,num2);}}}}setTimeout(“_very.deeply.defined._function(40,50)”,0);
9
  • 这并不能回答这个问题。要评论或要求作者澄清,请在他们的帖子下面留下评论——你可以随时评论自己的帖子,一旦你有足够的评论名声你将能够对任何帖子发表评论. 评论 2014年10月17日20:57
  • 请添加一个您将如何打电话的示例运行我带着一些论据。
    – 词典
    评论 2014年10月17日21:01
  • 1
    @我投票支持的词典删除在审阅队列中,因为它没有清晰地为这个问题提供一个实质性的答案,它本身没有什么价值。 评论 2014年10月17日21:22
  • 1
    此方法有潜在的巨大缺陷,因为它将执行渲染结束排队,从而进行此呼叫异步的
    – 彼得姆
    评论 2016年11月15日10:27
  • 2
    我喜欢这个答案,它似乎符合我的要求。
    – 昆顿
    评论 2018年9月18日9:27
4
const myFnCollection={myFnStringName:函数(参数){}};让fn=“myFnStringName”;// 1. 推荐if(窗口类型[fn]===“函数”){窗口[fn](参数);}// 2. 推荐if(myFnCollection[fn]的类型===“函数”){myFn集合[fn](args);}// 3. 评估是邪恶的;)if(eval类型(fn)===“函数”){评估(fn)(参数);}

因此,正如其他人所说,绝对最好的选择是:

窗口['myfunction'](参数)

就像杰森·邦廷说,如果函数的名称包含对象,则它将不起作用:

窗口['myobject.myfunction'](参数);//行不通窗口['myobject']['myfunction'](参数);//会起作用的

下面是我的函数版本,它将按名称执行所有函数(包括或不包括对象):

我的={代码:{是:{nice:函数(a,b){alert(a+“,”+b);}}}};guy=函数(){alert('awesome');}函数executeFunctionByName(str,args){var arr=str.split('.');var fn=窗口[arr[0]];对于(var i=1;i<arr.length;i++){fn=fn[arr[i]];}fn.应用(窗口,参数);}executeFunctionByName('my.code.is.nice',['arg1','arg2']);executeFunctionByName(“家伙”);

让t0=()=>{alert('red0')}var t1=()=>{警报('red1')}var t2=()=>{警报('rd2')}vart3=()=>{alert('red3')}vart4=()=>{alert('red4')}var t5=()=>{警报('red5')}vart6=()=>{alert('red6')}函数getSelection(类型){var评估选择={“标题0”:t0,“标题1”:t1,“标题2”:t2,“标题3”:t3,“title4”:t4,“title5”:t5,“title6”:t6,“default”:函数(){return'Default';}};return(evalSelection[type]||evalSelection['default'])();}获取选择('title1');

一个更面向对象的解决方案。。。

2

关于Jason和Alex的帖子的更多细节。我发现在上下文中添加默认值很有帮助。只要把context=context==未定义?窗口:上下文;在函数的开头。你可以改变窗口无论您首选的上下文是什么,那么每次在默认上下文中调用它时都不需要传入相同的变量。

2

为了补充Jason Bunting的答案,如果您正在使用nodejs或其他东西(这在dom js中也适用),可以使用而不是窗口(记住:eval是邪恶的:

此['fun'+'ctionName']();
2

我的代码中有一个非常类似的东西。我有一个服务器生成的字符串,其中包含一个函数名,需要将其作为第三方库的回调传递。所以我有一个代码,它获取字符串并返回一个指向函数的“指针”,如果找不到,则返回null。

我的解决方案与“Jason Bunting的功能非常有用"*,虽然它不会自动执行,并且上下文始终显示在窗口上。但这很容易修改。

希望这对某人有所帮助。

/***将包含函数或对象方法名的字符串转换为函数指针。*@param string函数*@return函数*/函数getFuncFromString(func){//如果已经是函数,则返回if(typeof func===‘function’)返回func;//如果是字符串,尝试查找对象的函数或方法(“obj.func”格式)if(函数类型===“字符串”){if(!func.length)返回null;var目标=窗口;var func=函数分割('.');while(函数长度){var ns=函数移位();if(typeof target[ns]===“undefined”)返回null;目标=目标[ns];}if(typeof target===“函数”)返回目标;}//如果无法解析,则返回null返回null;}
2

这里有一个健壮且可重用的解决方案,我最终为我的一个项目实现了它。

FunctionExecutor构造函数函数

用法:

let executor=new FunctionExecutor();executor.addFunction(两个)executor.addFunction(三个)执行人。执行(“一个”);执行人。执行(“三”);

显然,在项目中,添加所有需要按名称调用的函数都是通过循环完成的。

函数Executor:

函数FunctionExecutor(){this.functions={};this.addFunction=函数(fn){让fnName=fn.name;this.functions[fnName]=fn;}this.execute=函数执行(fnName,…args){if(this.functions中的fnName和this.fuctions[fnName]===“function”的类型){return this.functions[fnName](…args);}其他{console.log(“找不到”+fnName+“函数”);}}this.logFunctions=函数(){console.log(this.functions);}}

示例用法:

函数二(){console.log(“两个”);}函数三(){console.log(“三”);}let executor=new FunctionExecutor();executor.addFunction(两个)executor.addFunction(三个)执行人。执行(“一”);执行人。执行(“三”);
1

还有一些非常有用的方法。

http://devlicio.us/blogs/sergio_pereira/archive/2009/02/09/javascript-5-ways-to-call-a-function.aspx

var arrayMaker={someProperty:'此处有一些值',make:function(arg1,arg2){返回[this,arg1,arg2];},执行:函数名};
1

我忍不住要提到另一个技巧如果有未知数量的参数也作为字符串的一部分传递,则会有所帮助包含函数名称。例如:

var anningstring='调用my_func(123,true,“废话”)';

如果您的Javascript正在HTML页面上运行,那么您只需要一个不可见的链接;您可以将字符串传递到onclick(单击)属性,并调用点击方法。

<a href=“#”id=“link_secret”><!--不可见--></a>

$('#link_secret').attr('onclick',anningstring);$(“#link_secret”).click();

或创建<a>元素。

2
  • 创造性的解决方案,但这不适用于对象或数组类型参数。 评论 2016年10月11日9:42
  • 1
    这是在引擎盖下使用eval。。。真的是拐弯抹角 评论 2017年5月25日21:40
1

最简单的方法是像访问has元素一样访问它

窗口。客户端验证.forms.location_form

与相同

窗口。ClientSideValidations.forms['location_form']
1

人们一直这么说评估是危险和邪恶的,因为它可以运行任何任意代码。但是,如果将eval与白名单方法,假设您知道可能需要提前运行的所有可能的函数名,那么eval不再是安全问题,因为输入是不再武断。白名单是一种良好而频繁的安全模式。下面是一个示例:

函数runDynamicFn(fnName,…args){//也可以通过严格控制的配置进行馈电const allowedFnNames=['fn1','ns1.ns2.fn3','ns4.fn4'];return allowedFnNames.includes(fnName)?eval(fnName)(…args):未定义;}//测试功能:函数fn1(a){console.log('fn1用'调用,a)}runDynamicFn('alert(“抓住你了!”)')runDynamicFn('fn1','foo')

2
  • 在我看来,这仍然是一个糟糕的执行;最好映射函数:让allowedFns=新Map();allowedFns.set('fn1',fn1);允许Fns.set('ns1.ns2.fn3',ns1.ns2.fn3)。。。。如果评估是安全的,问题可能可以在没有评估:-P 评论 2020年4月21日15:32
  • 如果您知道所有函数名,为什么不创建一个包含这些函数的数组? 评论 2020年8月30日16:11
1

我喜欢简明的解决方案,所以可以采用这种更为ES6的方式:

const executeByName=(名称,originContext,…args)=>{const namespaces=name.split('.');const func=名称空间.pop();const funcContext=namespaces.reduce((context,namespace)=>context[namespace],originContext);return funcContext[func](…args);};
0

外观基本:

var namefunction=“jspure”;//字符串函数jspure(msg1='',msg2=''){控制台.log(消息1+(消息2!=“”?“/”+消息2:“”);}//多个参数//试验结果window[namefunction]('hello','hello again');//一些。。。eval[namefunction]='hello';//使用字符串或其他东西,但其eval仅为一个参数,不存在多个

存在其他类型的函数是看看例子尼尔斯·彼得森

0

谢谢你的回答。我在用Jason Bunting的功能在我的项目中。

我扩展了它,将其与可选超时一起使用,因为设置超时的常规方法不起作用。请参阅阿布希基斯诺问题

函数executeFunctionByName(函数名,上下文,超时/*,参数*/){var args=Array.prototype.slice.call(参数,3);var namespaces=functionName.split(“.”);var func=命名空间.pop();for(var i=0;i<namespaces.length;i++){context=context[namespaces[i]];}var timeoutID=设置超时(function(){context[func].apply(context,args)},超时);return timeoutID;}var非常={_深度:{_定义:{_函数:函数(num1,num2){console.log(“Execution_very_deeply _defined_function:”,num1,num2);}}}}console.log('现在等待')executeFunctionByName(“_very.deeply.defined._function”,窗口,2000,40,50);

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.