-1

次のコードを検討してください。

function foo()
{
    alert(1);
}

var str = foo.toString();

var fn = Function(str); 

console.log(fn2.toString());

出力は次のとおりです。

function anonymous() {
 function foo()
 {
     alert(1);
 }
} 

foo 関数を取り戻して fn に保存しようとしています。しかし、ここでは foo 関数が無名関数の中にあります。eval() を試しました。ただし、グローバル スコープで foo 関数を作成します。

文字列化された形式から関数を取得するにはどうすればよいですか?

更新: 関数から引数へのマップを作成しています。関数を一意に識別するために、 toString() メソッドを使用しました。

var map[foo.toString()] = [1,2,3]; //this list is populated dynamically in my code

// Now I want to call foo with [1,2,3] as arguments. For this I need to get back foo() function
foo(1,2,3)

更新 2: この問題を別の方法で解決しました。基本的に、(関数) --> (引数) のマップを作成したかったの
は、関連する質問へのリンクです: stackoverflow post

4

3 に答える 3

2

これはどう

function foo()
{
    alert(1);
}

var str = foo.toString();

var fn = Function('return ' + str)(); 


console.log(fn.toString());

本質的に、Function() はグローバル スコープを汚染しないようにします。そのため、独自のスコープに関数を追加します。したがって、匿名関数にラップされます

于 2013-04-26T15:04:36.920 に答える
0

何が問題なのvar fn = foo;ですか? デバッグ目的以外では、関数を文字列に変換する必要はありません。

于 2013-04-26T14:56:57.393 に答える
-1

私は明らかにあなたの完全なコンテキストを知りませんが、このように JavaScript で関数を「文字列化」する必要はおそらくないはずであることに同意する傾向があります。

私があなたの主な目的として解釈したものに基づいて、おそらくより良いアプローチがあります:

関数から引数へのマップを作成しています。

関数名自体をキーとして使用できない理由はありません。

簡単な例を次に示します。

function foo(x) {
  alert(x);
}

function bar(y) {
  alert(y);
}

var args = {
  foo: [1],
  bar: [2]
};

// Now call each function w/ the desired arguments:
for (var funcName in args) {
  window[funcName].apply(window, args[funcName]);
}

明らかに、window上記を関数が定義されているスコープに置き換えます(該当する場合)。

于 2013-04-26T15:17:34.253 に答える