2

Functionコンストラクターを使用して、組み立てられた文字列から関数を作成する、少しのメタプログラミングを行っています。

コンストラクターではFunction引数名と本体を指定できますが、関数の名前を指定する方法はないようです。

これは、標準に準拠した方法で内部から関数を参照する方法がないように見えることを意味します ( arguments.calleeES5 では非推奨であり、strict モードでは禁止されています)。リテラルの関数ステートメントを書いている場合、次のようにすることができます。

function myFunc(a, b, c) {
   if (c) {
      return myFunc(a, b);
   }
   return 0;
}

Function()代わりに(を使用せずに) を使用してその関数を構築している場合、この効果を達成する方法はありますeval()か?

4

3 に答える 3

1

現在、次のようなことをしている場合:

var f = new Function( argName, stringContainingCode );

次に、代わりに次のことを行うことができます。

var f = new Function( "return function " + functionName + "(" + argName + ") { " + stringContainingCode + "}")();

つまり、指定された名前で関数を返すラッパー内に関数を構築します。

于 2012-08-08T14:28:50.873 に答える
0

変数を新しい関数に等しくする

var myFunc = new Function( x, "return 2 * x ") ;

その後、通常どおり関数を参照できます

myFunc(7) ; // returns, like, 9 or something
于 2012-08-08T14:29:18.407 に答える
0

内部の名前付き関数はどうですか?

function myFunc(a, b, c) {
    return (function _myFunc(a, b, c) {
        if (c) {
            return _myFunc(a, b);
        }
        return 0;
    })(a, b, c);
}
于 2012-08-08T14:29:27.047 に答える