2012-08-01 24 views
0

如何使用函数名称作为参数传递。如何在函数中将其名称作为字符串传递时执行JavaScript函数?

例如:

showError('container', 'id', '- message', 'show'); 
showError('container', 'id', '', 'hide'); 


function showError(container, id, msg, action) 
{  
    if(action == 'show') { 
     $('#' + container).show();  
     $('#' + id).html(msg).show(); 
    } 
    else { 
     $('#' + container).hide();  
     $('#' + id).html(msg).hide(); 
    } 

} 
+0

尝试eval()http://stackoverflow.com/questions/86513/why-is-using-the-javascript-eval-function-a-bad-idea – LosManos 2012-08-01 18:07:49

+1

@LosManos:-1。 [阅读](http://stackoverflow.com/a/87260/1048572)链接之前,然后不要这样做。 – Bergi 2012-08-01 18:13:21

+0

@Bergi:是吗?我试图说,eval是一种选择,但不必写文本来解释它的优点和缺点。其他答案虽然更好,但只是一个评论。 – LosManos 2012-08-03 17:13:15

回答

2

一般情况下,括号标记是好的。在你的情况下,使用toggle

function showError(container, id, msg, action) 
{  
     $('#' + container).toggle(action === 'show');  
     $('#' + id).html(msg).toggle(action === 'show'); 
} 

甚至(如BERGI建议):

function showError(container, id, msg) 
{  
     $('#' + container).toggle(!!msg);  
     $('#' + id).html(msg); 
} 

(它使用我自己的发明,双响!!,这truthy或falsy值转换为自己的布尔等值。)

3

obj.foo()真的是一个2步的事情。 obj.foo返回一个函数对象,然后()执行它。 obj['foo']返回相同的函数对象,所以添加一个()来执行它。

由于obj['foo']obj.foo相同。即使该属性的值是一个函数。因此,您始终可以使用[]访问器访问任何属性,并使用字符串作为关键名称。

$('#' + container)[action](); 
2

使用bracket notation用绳子来访问相应的方法:

function showError(container, id, msg, action) {  
    $('#' + container)[action]();  
    $('#' + id).html(msg)[action](); 
} 

然而,你的方法看起来很奇怪。我建议限制行动,这两个值,并做自动:

function showError(container, id, msg) { 
    var action = msg=='' ? 'hide' : 'show'; 
    $('#' + container)[action]();  
    $('#' + id).text(msg)[action](); 
} 
相关问题