JavaScriptを使用して文字列を関数に変換する

私は少しのグーグル・ラウンドをしましたが、この特定の問題は「文字列から関数名を評価する方法」と少し似ていますので、解決策を見つけるのが難しく、文字列を関数に変換したい私は次のようなものを持っていた:

for (var i = 0; i < someNumber ; i++) {
    var foo = "function() { someObject.someOtherFunctionCall(" + i + ") }";
    someArray[i] = foo;
}

私が呼び出すことができるようにfooを型キャストする方法

someArray[0]();

私は機能に焼かれた価値、どんなアイデアが必要ですか?

編集:私は混乱のために "私"の謝罪のために "値"を置き換えただけです

更新:

さて、あなたの質問や懸念のほとんどに答えるために、私はicktoofayの答えを受け入れました。私は、すべてのメソッドが、呼び出し場所のスコープに変数を渡していないか、または最後の関数の変数値で保持されていたクロージャを必要とするかのいずれかの方法を試してみました。残念ながら、残りのコードを制御できません関数が最終的に呼び出される場所を変更することはできません。

これはおそらく一時的な解決策です。私は関数の文字列を醜く解析する方法が分かっています。ブラウザの互換性がある限り、これは1つの環境でのみ実行されるため、私たちはそこではかなり安全だと思います。

とにかく、すぐにお返事とお話をありがとうございました。

4
私は本当に文字列として定義された関数を持っている理由について本当に興味がありますか?
追加された 著者 Andrew,
私は本当にあなたがなぜこのことをしたいのかを知りたいのですが、それは悪い考え(tm)のように思えます。
追加された 著者 rossipedia,

5 答え

単純にメソッドを呼び出す一連の関数が必要な場合は、はるかに簡単です:

for(var i=0; i

これには、 Function.bind 、古いブラウザでは利用できない可能性があります。古いブラウザのサポートが必要な場合は、シムを使うか、このバージョンを使用してください:

for(var i=0; i

Edit: Here is the old answer, which should also work, but is less elegant:

for (var i = 0; i < someNumber ; i++) {
    var foo = new Function("someObject", "return function() { someObject.someOtherFunctionCall(" + value + ") }")(someObject);
    someArray[i] = foo;
}
4
追加された

試してください:

var foo = function() { someObject.someOtherFunctionCall(value ) };
someArray[i] = foo; 

または

fooがグローバル変数でない場合、これを実行して値を渡すことができます:

 var foo = (function(value) { return function() { someObject.someOtherFunctionCall(value ) } }) ( value );  
2
追加された
私はこれを試してみました。このループの問題は、クロージャ "値"が渡された値の最後の反復に設定され、すべての呼び出しが99の値を持つようになります
追加された 著者 Waltzy,

ちょうどそれにそれ自身の範囲を与え、

for (var i = 0; i < someNumber ; i++) {
    someArray[i] = (function(idx){
        return function() { someObject.someOtherFunctionCall(idx); };
    })(i)        
}
1
追加された

括弧で囲まれた部分だけを使用し、 eval()関数を介して呼び出すことができます。

here is the description: http://www.w3schools.com/jsref/jsref_eval.asp

ここに例があります:

for (var i = 0; i < someNumber ; i++) {
    var foo = "someObject.someOtherFunctionCall(" + value + ");";
    someArray[i] = foo;
}

eval(someArray[0]);
1
追加された

たとえそれが働いても、その値が墨塗りされていない入力であれば、むしろ安全ではありません。私はちょうど匿名関数(文字列なし)を、次のように使用します。

var foo = function() { someObject.someOtherFunctionCall(value) };

JSのスコープのため、 value は後で foo で利用できるようになりますその行の後の値を変更しない限り変更されたを読んでください。

編集:質問をよく見てみると、これはうまくいきません。私の答えを再考する時間を与えてください。

更新:これを本当に行いたい場合は、他の回答を検討してください。

(JS神は泣くだろうが...)

1
追加された
ああ、私はこれについてコメントするだけの試合だった:P
追加された 著者 Waltzy,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript