3

使用方法についてのスタックオーバーフローに関する多数の投稿をここで読みました

arguments.callee.caller or arguments.callee.caller.toString()

簡単な検索を行うと、これに関する多数の投稿を見つけることができます。

だから、これを自分で試してみることにしました!ただし、javascriptオブジェクト内で関数の名前を見つけたいのですが、実際の関数名ではなく、関数内のコードを返しているようです。

これがjsFiddleです:http://jsfiddle.net/4Cp5Z/18/

要約すると、新しいアプリを作成してから、を呼び出しますapp.testFunctiontestFunction()を呼び出しreceiver()、私はvar nameに等しいことを期待していますtestFunction

app = function() {

    this.testFunction = function() {

        this.receiver();

    };

    this.receiver = function() {

        var name = this.receiver.caller.toString();
        // this.receiver.caller.name outputs nothing...

    };
};
4

1 に答える 1

3

この例の関数には名前がありません。それらはすべて匿名です。名前を付けるために割り当てる変数やプロパティですが、関数にはありません。関数に本当の名前を付けるには、functionキーワードと開始括弧の後に名前があります。

// Declaration
function nameIsHere() {
}

// Expression -- but beware of these ("named function expressions"), see below
var f = function nameIsHere() {
};

(名前付き関数式を使用する場合、IE8以前では2つの別個の関数が作成されることに注意してください。)

arguments.calleeその関数の呼び出し内から、それをサポートするエンジン上で、厳密モードを使用していない場合は、関数オブジェクトへの参照を提供します。パフォーマンスが大幅に低下し(一部のエンジンでは桁違い)、厳密モードでは許可されないことに注意してください。

arguments.callee.caller現在の関数を呼び出した関数への参照を提供します(厳密モードでない場合)。それはあなたにその名前を与えるのではなく、代わりに実際の参照を与えます。

Function#toString仕様で指定された動作はありませんが、すべての主要なデスクトップブラウザーで、関数のソースコードの表現を提供します。(これは必ずしもモバイルブラウザやニッチブラウザには当てはまりません。)ただし、これは非標準であり、ブラウザごとに異なることに注意してください(たとえば、コメントを含めてソースコードをかなり逐語的に返すものもあれば、逆コンパイルされた表現を返すものもあります)。それらのコンパイルされた関数の)。

すべてではありませんが、多くのエンジンでサポートされている非標準のFunction#nameプロパティがあります。これにより、関数の本当の名前がわかります(関数がある場合)。しかし、繰り返しになりますが、ES5でも標準化されたことはなく、関数には名前がありません。

于 2012-12-28T23:23:03.730 に答える