Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过字符串调用jQuery定义的函数_Javascript_Jquery - Fatal编程技术网

Javascript 通过字符串调用jQuery定义的函数

Javascript 通过字符串调用jQuery定义的函数,javascript,jquery,Javascript,Jquery,我想调用我在jQuery的document ready函数中定义的函数,但遇到了一些麻烦。我有以下代码: jQuery(document).ready( function($) { function test1() { alert('test1'); } function test2() { alert('test2'); } var test_call = '2'; var fn = 'test' + te

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

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]
似乎不起作用。这两个测试函数似乎不是window变量中的索引。非常感谢您的帮助和知识。

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

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

如果不使用
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]();
    }

});
或者注册可以在函数的定义中完成。如果它们是全局函数,则会隐式注册到
窗口
对象上,但它们不是全局函数,因为它们的作用域位于document.ready handler函数中:

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

});

您是在JSFIDLE或类似的工具上测试它吗?window[fn]将不起作用,因为您是在闭包中定义函数,所以它们不会添加到全局(window)作用域中。是否有一个函数带有参数而不是选项?即使没有显式调用
eval()
,这仍然使用
eval()
内部的,并且受到eval可能涉及的任何问题的影响(例如从外部源执行任意代码)。这也不会在下一行代码之前同步发生,如果这很重要的话。我不确定是否缺少处理document.ready中作用域函数的另一个全局变量(或类似于jQuery的变量)。document.ready中的代码只是匿名函数中的代码,因此没有可在其中寻址的命名作用域。其中声明的函数只是局部函数(与局部变量相同)。您可以将函数定义移动到全局范围,这样它们就会自动注册到窗口对象中(请参阅我刚才添加到答案中的最后一个选项)。