通过string调用jQuery定义的函数

时间:2011-09-15 00:10:03

标签: javascript jquery

我想调用我在jQuery的文档就绪函数中定义的函数,但是遇到了一些麻烦。我有以下代码:

jQuery(document).ready( function($) {

    function test1() {
        alert('test1');
    }

    function test2() {
        alert('test2');
    }

    var test_call = '2';

    var fn = 'test' + test_call;

    // use fn to call test2

});

我不想使用eval,而window[fn]似乎不起作用。两个测试函数似乎不是窗口变量中的索引。我很感激帮助和知识。

2 个答案:

答案 0 :(得分:11)

我只能想到不使用eval()或某种形式的eval(将字符串传递给setTimeout()eval()的一种形式),就是注册相关的函数对象上的名称,然后在该对象上查找函数名称:

jQuery(document).ready( function($) {

    function test1() {
        alert('test1');
    }

    function test2() {
        alert('test2');
    }

    // register functions on an object
    var funcList = {};
    funcList["test1"] = test1;
    funcList["test2"] = test2;


    var test_call = '2';

    var fn = 'test' + test_call;

    if (fn in funcList) {
        funcList[fn]();
    }

});

或者可以在函数的定义中完成注册。如果它们是全局函数,它们将隐式注册在window对象上,但它们不是全局的,因为它们的作用域是document.ready处理函数:

jQuery(document).ready( function($) {

    var funcList = {};

    funcList.test1 = function test1() {
        alert('test1');
    }

    funcList.test2 = function test2() {
        alert('test2');
    }

    var test_call = '2';
    var fn = 'test' + test_call;

    if (fn in funcList) {
        funcList[fn]();
    }

});

或者,您可以将函数移动到全局范围,以便它们自动注册到窗口对象,如下所示:

function test1() {
    alert('test1');
}

function test2() {
    alert('test2');
}

jQuery(document).ready( function($) {

    var test_call = '2';
    var fn = 'test' + test_call;

    if (fn in window) {
        window[fn]();
    }

});

答案 1 :(得分:3)

如果不是Eval,最好的方法是使用零毫秒的setTimeout,因为你可以将函数指定为字符串。

setTimeout('myfunction()',0,);