4

为简单起见,我包含了一个通过函数名动态调用函数的脚本:

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);
}

但是 functionsay_helloworld的代码是以静态方式编写的。我想要类似的东西:

var function_implementation = 'function say_'+foo+bar+
    '(the_world){alert("Hello " + the_world);}';
eval(function_implementation);

但不使用 eval()。还有一种更丑陋的方法:通过 AJAX 调用来获取函数。

你能看到更好的方法吗?

4

3 回答 3

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');
于 2010-07-29T12:22:21.527 回答
1

如果你想动态生成你的函数,eval你可以使用构造函数

Function([arg1[, arg2[, ... argN]],] functionBody)

这样你就可以做类似的事情

var func = new Function('message', 'alert("Hello, " + message);')
func('world!');

有关更多说明,请参阅MDC

干杯

注意:我以前从未使用过这种方法,也从未使用过 Function() 构造函数。所以我不知道这是否还有其他缺点。

于 2010-07-29T12:29:37.563 回答
1

您可以使用超时来解释您的代码,但它可能在内部使用 eval 所以不确定您是否想要这个..

fText = 'function test(a){alert(a);}';
setTimeout(fText,0);

但你需要在调用它之前允许几毫秒..

于 2010-07-29T12:46:12.027 回答