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

ただし、関数say_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 に答える