我得到了一个字符串:

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

我想翻译成一个函数调用,像这样:

clickedOnItem(IdofParent);

当然,这必须用JavaScript来完成。当我在设置上做警报时。functionName + '(' + t.parentNode.id + ')';似乎每件事都是正确的。我只需要调用它转换成的函数。

传说:

settings.functionName = clickedOnItem

t.parentNode.id = IdofParent

当前回答

我希望能够将函数名作为字符串,调用它,并将参数传递给函数。我无法得到这个问题的选择答案,但这个答案准确地解释了它,这里有一个简短的演示。

function test_function(argument)    {
    alert('This function ' + argument); 
}

functionName = 'test_function';

window[functionName]('works!');

这也适用于多个参数。

其他回答

如果设置。functionName已经是一个函数了,你可以这样做:

settings.functionName(t.parentNode.id);

否则,这也应该工作,如果设置。functionName只是函数名:

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

下面是一个更通用的方法来做同样的事情,同时支持作用域:

// 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有一个eval函数,它计算字符串并将其作为代码执行:

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

不需要eval()

eval()是你需要这样做的函数,但我建议尝试其中一种方法来尽量减少eval的使用。希望其中一个对你有意义。

存储函数

将函数存储为函数,而不是字符串,然后将其作为函数使用。在哪里存储函数取决于你自己。

var funcForLater = clickedOnItem;

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

or

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的方法被调用。)