我有一个字符串:
settings.functionName + '(' + t.parentNode.id + ')';
我希望将其转换为函数调用,如下所示:
clickedOnItem(IdofParent);
这当然必须在JavaScript中完成。当我在settings.functionName + '(' + t.parentNode.id + ')';
上发出警报时,它似乎可以使一切正确。我只需要调用它将转换成的函数。
图例:
settings.functionName = clickedOnItem
t.parentNode.id = IdofParent
答案 0 :(得分:351)
看到我讨厌eval,我是not alone:
var fn = window[settings.functionName];
if(typeof fn === 'function') {
fn(t.parentNode.id);
}
编辑:回复@Mahan的评论:
在这种特殊情况下,settings.functionName
将是"clickedOnItem"
。这会在运行时将var fn = window[settings.functionName];
转换为var fn = window["clickedOnItem"]
,这将获得对function clickedOnItem (nodeId) {}
的引用。一旦我们在变量中引用了一个函数,我们可以通过“调用变量”调用这个函数,即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);
}
答案 1 :(得分:70)
window[settings.functionName](t.parentNode.id);
不需要eval()
答案 2 :(得分:66)
这是一种更通用的方法,同时支持范围:
// 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]];
}
希望它可以帮助一些人。
答案 3 :(得分:14)
JavaScript有一个eval
函数,用于计算字符串并将其作为代码执行:
eval(settings.functionName + '(' + t.parentNode.id + ')');
答案 4 :(得分:13)
eval()是你需要做的功能,但我建议你尝试使用其中一个来最小化eval的使用。希望其中一个对你有用。
存储功能
将函数存储为函数,而不是字符串,稍后将其用作函数。实际存储功能的地方取决于你。
var funcForLater = clickedOnItem;
// later is now
funcForLater(t.parentNode.id);
或
someObject.funcForLater = clickedOnItem;
// later is now
(someObject.funcForLater)(t.parentNode.id);
存储功能名称
即使您必须将函数名称存储为字符串,也可以通过执行
来最小化复杂性(eval(settings.functionName))(t.parentNode.id);
最小化您必须构建和评估的Javascript数量。
处理程序字典
将您可能需要的所有动作函数放入对象中,并使用该字符串将其称为字典样式。
// 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
的方法。)
答案 5 :(得分:9)
虽然我喜欢第一个答案并且我讨厌eval,但我想补充说还有另一种方法(类似于eval)所以如果你可以绕过它并且不使用它,你最好这样做。但在某些情况下,您可能希望在某个ajax调用之前或之后调用一些javascript代码,如果您在自定义属性而不是ajax中使用此代码,则可以使用此代码:
var executeBefore = $(el).attr("data-execute-before-ajax");
if (executeBefore != "") {
var fn = new Function(executeBefore);
fn();
}
或者最终将其存储在函数缓存中,如果您可能需要多次调用它。
再次 - 如果您有其他方法,请不要使用eval或此方法。
答案 6 :(得分:8)
如果settings.functionName
已经是一个功能,你可以这样做:
settings.functionName(t.parentNode.id);
如果settings.functionName
只是函数的名称,那么这也应该有效:
if (typeof window[settings.functionName] == "function") {
window[settings.functionName](t.parentNode.id);
}
答案 7 :(得分:7)
我希望能够将函数名称作为字符串,调用它,并将参数传递给函数。我无法得到这个问题的选定答案,但是answer完全解释了这一点,这是一个简短的演示。
function test_function(argument) {
alert('This function ' + argument);
}
functionName = 'test_function';
window[functionName]('works!');
这也适用于多个参数。
答案 8 :(得分:3)
我花了一段时间才弄清楚,因为传统的window['someFunctionName']()
起初并不适合我。我的函数名称是从数据库中作为AJAX响应提取的。此外,无论出于何种原因,我的函数都是在窗口范围之外声明的,所以为了解决这个问题,我必须重写我调用的函数
function someFunctionName() {}
到
window.someFunctionName = function() {}
从那里我可以轻松地呼叫window['someFunctionName']()
。我希望这有助于某人!
答案 9 :(得分:2)
我更喜欢使用这样的东西:
window.callbackClass['newFunctionName'] = function(data) { console.log(data) };
...
window.callbackClass['newFunctionName'](data);
答案 10 :(得分:2)
基于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);
答案 11 :(得分:0)
在使用CommonJS规范的javascript中,比如node.js,你可以做我在下面显示的内容。这对于通过字符串访问变量非常方便,即使它未在window
对象上定义。如果有一个名为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如此高兴的另一个原因。
答案 12 :(得分:-7)
eval("javascript code");
在处理JSON时广泛使用。