37个答案
窗口[“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,参数);
-
5 -
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”,窗口) ,没有办法 这 指的是同一件事。 也许它应该使用最后一个名称空间作为范围,或者 窗口 如果没有名称空间。 或者您可以允许用户将范围指定为参数。 – JW公司。 评论 2011年7月6日23:08
函数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); }
窗口[“foo”](arg1,arg2);
eval(fname)(arg1,arg2);
var自定义对象={ customFunction:函数(param){…} };
自定义对象['customFunction'](参数);
const FunctionNames=对象.freeze({ FirstFunction:“FirstFunction”, 第二功能:“第二功能” }); ... var自定义对象={ [FunctionNames.FirstFunction]:函数(param){…}, [FunctionNames.SecondFunction]:函数(param){…} }; ... customObject[FunctionNames.FirstFunction](参数);
-
@伊布森夫,谢谢你的评论,帮助我确定这是最好的回应。 我创建了一个函数对象数组,然后使用它来创建一个deferred.promises数组。 我在下面放了一些示例代码。 (我不想创建新回复 借 鲁本的回应。) – 用户216661 评论 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})}; – 用户216661 评论 2016年1月8日16:58 -
var codeToExecute=“My.Namespace.functionName()”; var tmpFunc=新函数(codeToExecute); tmpFunc();
-
三 -
1 -
13 -
2 -
2 “不过,使用Function()构造函数不是一个好主意(它和eval()一样糟糕),因为代码是作为字符串传递和计算的。”——Javascript Patterns,Ch4,p.58 – 多米赫 评论 2019年11月18日7:46
X类{ 方法1(){ console.log(“1”); } 方法2(){ 本[方法1](); console.log(“2”); } } 设x=新x(); x【方法2】();
1 2
-
2 -
2 -
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 -
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); }
//调用不带参数的全局函数 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不是函数 */
-
-
2 -
-
这对我不起作用。我有一个命名空间函数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
函数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”);// 应在控制台中引发错误
var myObject=新对象(); myObject[“functionName”](参数);
var now=新日期(); 现在[“getFullYear”]()
函数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”);
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);
-
-
-
1 -
1 -
2
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');
此['fun'+'ctionName']();
/** *将包含函数或对象方法名的字符串转换为函数指针。 *@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; }
let executor=new FunctionExecutor(); executor.addFunction(两个) executor.addFunction(三个) 执行人。执行(“一个”); 执行人。执行(“三”);
函数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(三个) 执行人。执行(“一”); 执行人。执行(“三”);
var arrayMaker={ someProperty:'此处有一些值', make:function(arg1,arg2){ 返回[this,arg1,arg2]; }, 执行:函数名 };
$('#link_secret').attr('onclick',anningstring); $(“#link_secret”).click();
窗口。 客户端验证.forms.location_form
窗口。 ClientSideValidations.forms['location_form']
函数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')
const executeByName=(名称,originContext,…args)=>{ const namespaces=name.split('.'); const func=名称空间.pop(); const funcContext=namespaces.reduce((context,namespace)=>context[namespace],originContext); return funcContext[func](…args); };
var namefunction=“jspure”;// 字符串 函数jspure(msg1='',msg2=''){ 控制台.log(消息1+(消息2!=“”?“/”+消息2:“”); }//多个参数 //试验结果 window[namefunction]('hello','hello again');// 一些。。。 eval[namefunction]='hello';// 使用字符串或其他东西,但其eval仅为一个参数,不存在多个
函数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);