1

通常、関数の名前を含む文字列があれば、次のようなことができます...

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() を使用することもできますが、それを避けようとしています...

ありがとう。

4

1 に答える 1

4

代わりに、オブジェクト マップを使用して関数を格納します。

    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);
            }
        }
    };
于 2013-03-28T11:06:38.433 に答える