如何将一个string变成一个JavaScript函数调用?

我得到了一个string:

settings.functionName + '(' + t.parentNode.id + ')'; 

我想要翻译成如下所示的函数调用:

 clickedOnItem(IdofParent); 

这当然必须用JavaScript来完成。 当我在settings.functionName + '(' + t.parentNode.id + ')';上做一个alert时settings.functionName + '(' + t.parentNode.id + ')'; 它似乎让一切正确。 我只需要调用它将转换成的函数。

传说:

 settings.functionName = clickedOnItem t.parentNode.id = IdofParent 

看着我讨厌eval,我并不孤单 :

 var fn = window[settings.functionName]; if(typeof fn === 'function') { fn(t.parentNode.id); } 

编辑:在回复@马汉的评论:在这种特殊情况下, settings.functionName将是"clickedOnItem" 。 这将在运行时翻译var fn = window[settings.functionName];var fn = window["clickedOnItem"] ,这将获得function clickedOnItem (nodeId) {}的引用。 一旦我们有一个variables内的函数的引用,我们可以通过“调用variables”,即fn(t.parentNode.id) ,这等于clickedOnItem(t.parentNode.id) ,这是什么OP通缉。

更完整的例子:

 /* Somewhere: */ window.settings = { /* [..] Other settings */ functionName: 'clickedOnItem' /* , [..] More settings */ }; /* Later */ function clickedOnItem (nodeId) { /* Some cool event handling code here */ } /* Even later */ var fn = window[settings.functionName]; /* note that settings.functionName could also be written as window.settings.functionName. In this case, we use the fact that window is the implied scope of global variables. */ if(typeof fn === 'function') { fn(t.parentNode.id); } 
 window[settings.functionName](t.parentNode.id); 

不需要eval()

这是一个更通用的方式来做同样的事情,同时支持范围:

 // Get function from string, with or without scopes (by Nicolas Gauthier) window.getFunctionFromString = function(string) { var scope = window; var scopeSplit = string.split('.'); for (i = 0; i < scopeSplit.length - 1; i++) { scope = scope[scopeSplit[i]]; if (scope == undefined) return; } return scope[scopeSplit[scopeSplit.length - 1]]; } 

希望它能帮助一些人。

JavaScript有一个评估string并将其作为代码执行的eval函数:

 eval(settings.functionName + '(' + t.parentNode.id + ')'); 

eval()是你需要做的function,但我build议尝试其中的一种方法来最小化eval的使用。 希望他们中的一个对你有意义。

存储function

将函数作为函数存储,而不是string,稍后将其用作函数。 你实际存储的function取决于你。

 var funcForLater = clickedOnItem; // later is now funcForLater(t.parentNode.id); 

要么

 someObject.funcForLater = clickedOnItem; // later is now (someObject.funcForLater)(t.parentNode.id); 

存储function名称

即使您必须将函数名称存储为string,您也可以通过执行将复杂性降至最低

 (eval(settings.functionName))(t.parentNode.id); 

这最大限度地减less了你必须构build和评估的Javascript的数量。

处理程序字典

把你可能需要的所有动作函数放到一个对象中,然后用string调用它们的字典样式。

 // global itemActions = { click: clickedOnItem, rightClick: rightClickedOnItem /* etc */ }; // Later... var actionName = "click"; // Or wherever you got the action name var actionToDo = itemActions[actionName]; actionToDo(t.parentNode.id); 

(小调:如果在这里你使用了语法itemActions[actionName](t.parentNode.id);那么这个函数将作为itemActions一个方法被调用。

虽然我喜欢第一个答案,但是我讨厌eval,我想补充说的是,还有另外一种方法(类似于eval),所以如果你可以绕过而不使用它,那么你最好这样做。 但在某些情况下,您可能需要在某个Ajax调用之前或之后调用一些javascript代码,如果您在自定义属性而不是ajax中使用此代码,则可以使用以下代码:

  var executeBefore = $(el).attr("data-execute-before-ajax"); if (executeBefore != "") { var fn = new Function(executeBefore); fn(); } 

或者,如果您可能需要多次调用它,最终将其存储在函数caching中。

再次 – 不要使用评估或这种方法,如果你有另一种方法来做到这一点。

如果settings.functionName已经是一个函数,你可以这样做:

 settings.functionName(t.parentNode.id); 

否则,这也应该工作,如果settings.functionName只是函数的名称:

 if (typeof window[settings.functionName] == "function") { window[settings.functionName](t.parentNode.id); } 

我想能够把一个函数名称作为一个string,调用它,并传递一个参数给函数。 我无法得到这个问题的select答案,但这个答案完全解释了,这是一个简短的演示。

 function test_function(argument) { alert('This function ' + argument); } functionName = 'test_function'; window[functionName]('works!'); 

这也适用于多个参数。

这花了我一些时间,因为传统的window['someFunctionName']()开始并不适合我。 我的函数的名字被作为来自数据库的AJAX响应。 另外,无论出于何种原因,我的函数都是在窗口范围之外声明的,所以为了解决这个问题,我不得不重写我所调用的函数

 function someFunctionName() {} 

 window.someFunctionName = function() {} 

从那里我可以轻松地调用window['someFunctionName']() 。 我希望这可以帮助别人!

根据Nicolas Gauthier的回答:

 var strng = 'someobj.someCallback'; var data = 'someData'; var func = window; var funcSplit = strng.split('.'); for(i = 0;i < funcSplit.length;i++){ //We maybe can check typeof and break the bucle if typeof != function func = func[funcSplit[i]]; } func(data); 

我更喜欢使用这样的东西:

 window.callbackClass['newFunctionName'] = function(data) { console.log(data) }; ... window.callbackClass['newFunctionName'](data); 

在使用CommonJS规范的javascript中,比如node.js,你可以做下面展示的东西。 即使没有在window对象上定义,用string访问variables也是非常方便的。 如果有一个名为MyClass的类,在名为MyClass.js的CommonJS模块中定义

 // MyClass.js var MyClass = function() { // I do stuff in here. Probably return an object return { foo: "bar" } } module.exports = MyClass; 

然后,您可以从另一个名为MyOtherFile.js的文件中做这个好玩的巫术

 // MyOtherFile.js var myString = "MyClass"; var MyClass = require('./' + myString); var obj = new MyClass(); console.log(obj.foo); // returns "bar" 

CommonJS的另一个原因是这样的乐趣。

 eval("javascript code"); 

它在处理JSON时被广泛使用。