2014-01-22 33 views
0

我想调用一个函数,其名称在其他地方定义的代码。Javascript - 调用基于变量的函数名称

下面是示例代码:

Inner.testFunc = function(node) { 
var functionName = node.substring(node, to.indexOf('@')); 
// call the function based on functionName 
[functionName + '()'] 
} 

function something() { 
//doing something 
}; 

... 

假设functionName = something,这是打电话的功能,但它没有这样做。

我尝试使用其他链接,如Call javascript function which name is in variable但它没有帮助。

我使用eval()也试过:

eval(functionName + '()'); 

但这回一些有关非法字符...

+0

当''eval''时'functionName'的值是多少? – neuront

+0

它具有正确的值。解决方案如下,“()”应该在第一个括号之外。 – Gary

回答

3

您的eval呼叫可能不工作;改用:

eval(functionName)(); //note() after the eval statement 

在你的代码保证:第一,functionNamesomething

console.log(functionName === 'something') //true

+0

哇,我甚至没有想到这个xD它使用eval(functionName)();谢谢! – Gary

+1

记得接受答案,如果它的工作! :) –

+1

它不会让我,说3分钟左= =)等待计时器去^^ – Gary

0

functionName是子法的回归,而不是函数本身。

2

如果你的功能在全球范围内定义,你可以利用的事实,全局变量和全局函数可以为全球范围内的属性访问:

function something(){ console.log('Works!'); } 
window['something'](); // Works! 

如果不是,也许对其的引用被存储为对象的属性:

var x = { something : function(){ console.log('Also works'); } }; 
x['something'](); // Also works 

否则,无法访问。

+0

窗口[]我已经试过了,它不起作用。尝试直接用窗口调用它,就像你做的那样。我会诚实地说,我不知道它在全局范围内意味着什么,但我确定它不是......我在外部JS文件中运行这个而不是在html中 – Gary

+0

在全局范围内意味着函数的定义不在另一个函数内。在这种情况下,某些东西不在全局范围内:'function(){function something(){}}'。脚本是否是外部的并不重要。 – Tibos

+0

啊我看到,在这种情况下,它不在全局范围内,它定义在一个函数中:test.module(){.... something(){...} ....} – Gary

0

您可以使用它们的名称作为键创建功能图,如下所示。然后您可以将substring的输出传递给地图并调用该函数。

function myName() { 
    console.log("thefourtheye"); 
} 

var functions = {    // map of functions and their names 
    name: myName 
}; 

functions["name"]();   // Instead of "name" pass the result of substring 
+0

这里的问题是我有大约20个函数可以从中调用,我需要单独将这些函数添加到函数中? – Gary

+0

@Gary Yup。这将是有效的方式。 – thefourtheye

0

这是一个有点冗长,但关于使用CASE语句,基于节点的值运行功能是什么。

+0

这是一个稍微简化的版本,但后来在代码中,我正在削减三个变量来构建函数名,所以它会有点复杂,然后 – Gary

+0

你不会轻易对自己是你! –