Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.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-包含函数名的字符串_Javascript - Fatal编程技术网

JavaScript-包含函数名的字符串

JavaScript-包含函数名的字符串,javascript,Javascript,通常,如果我有一个包含函数名的字符串,我可以做如下操作 window[functionName](arguments); 但是,当使用jQuery对象风格编程或任何正确的术语时,这都不起作用。比如, (function ($) { "use strict"; $.test = (function () { var func1 = function () { alert("func1"); }; var f

通常,如果我有一个包含函数名的字符串,我可以做如下操作

window[functionName](arguments);
但是,当使用jQuery对象风格编程或任何正确的术语时,这都不起作用。比如,

(function ($) {
    "use strict";
    $.test = (function () {
        var func1 = function () {
            alert("func1");
        };

        var func2 = function () {
            alert("func2");
        };

        return {
            Test: function (functionName) {
                var fn = window[functionName]; // Need to specify scope here, somehow
                if (typeof fn === 'function') {
                    fn();
                } else {
                    alert("fn() = " + fn);
                }
            }
        }

    } ());
} (jQuery));

$.test.Test("func1");
$.test.Test("func2");
理想情况下,这将显示func1后跟func2-但显然范围界定是错误的,我不确定在这种情况下如何表示它

在这种情况下,如何指定要调用的函数的范围?我当然可以使用eval,但我正在努力避免


谢谢。

使用对象映射来放置函数:

    var funcs = {
        func1: function () {
            alert("func1");
        },
        func2: function () {
            alert("func2");
        }
    };

    return {
        Test: function (functionName) {
            var fn = funcs[functionName];
            if (typeof fn === 'function') {
                fn();
            } else {
                alert("fn() = " + fn);
            }
        }
    };

使用对象映射来容纳函数:

    var funcs = {
        func1: function () {
            alert("func1");
        },
        func2: function () {
            alert("func2");
        }
    };

    return {
        Test: function (functionName) {
            var fn = funcs[functionName];
            if (typeof fn === 'function') {
                fn();
            } else {
                alert("fn() = " + fn);
            }
        }
    };

@AndyE的回答是正确的,但供您参考,此jQuery对象样式没有正式术语,而是一个闭包示例,即使用立即调用的函数表达式创建的词法范围。@AndyE的回答是正确的,但供您参考,此jQuery对象样式没有正式术语,但这是一个闭包示例,即使用立即调用的函数表达式创建的词法作用域;事后看来很明显,但我走错了范围!谢谢事后看来很明显,但我走错了范围!