为简单起见,我已经包含了一个脚本,它通过名称动态调用函数:
var foo = "hello";
var bar = "world";
var function_name = "say_" + foo + bar;
// Since its name is being dynamically generated, always ensure your function actually exists
if (typeof(window[function_name]) === "function")
{
window[function_name](" World!");
}
else
{
throw("Error. Function " + function_name + " does not exist.");
}
function say_helloworld(the_word)
{
alert("Hello " + the_word);
}
但函数say_helloworld
的代码是以静态方式编写的。我想要像:
var function_implementation = 'function say_'+foo+bar+
'(the_world){alert("Hello " + the_world);}';
eval(function_implementation);
但不使用eval()。有一种更加丑陋的方法:进行AJAX调用以获得功能。
你能看到更好的方法吗?
答案 0 :(得分:5)
您可以使用内联函数表达式:
window['say_'+foo+bar]= function(the_world) {
alert('Hello '+the_world);
};
但是,几乎没有充分的理由使用动态命名的变量。将函数存储在单独的查找对象中:
var says= {
helloworld: function(the_world) {
alert('Hello '+the_world);
},
somethingelse: function(otherthing) {
alert('Something else with '+otherthing);
}
};
says[somevar]('potatoes');
答案 1 :(得分:1)
如果要在没有eval
的情况下动态生成函数,可以使用构造函数
Function([arg1[, arg2[, ... argN]],] functionBody)
这样你可以做像
这样的事情var func = new Function('message', 'alert("Hello, " + message);')
func('world!');
有关更多说明,请参阅MDC。
干杯
注意:我之前从未使用过这种方法,之前我从未使用过Function()构造函数。所以我不知道这是否有任何其他缺点。
答案 2 :(得分:1)
你可以使用一个超时来解释你的代码,但它可能在内部使用eval所以不确定你是否想要这个..
fText = 'function test(a){alert(a);}';
setTimeout(fText,0);
但是你需要在调用它之前允许几毫秒。