如何将一个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时被广泛使用。