4

次の例を考えてみましょう。

var obj = function(){};

function apply(target, obj) {

    if (target && obj && typeof obj == "object") {
        for (var prop in obj) {
            target[prop] = obj[prop];
        }
    }

    return target;
}

apply(obj.prototype, {
    firstFunction: function (){
        this.secondFunction();
    },
    secondFunction: function (){
        // how do I know what function called me here?
        console.log("Callee Name: '" + arguments.callee.name + "'");
        console.log("Caller Name: '" + arguments.callee.caller.name + "'");
    }
});

var instance = new obj();

instance.firstFunction();

アップデート

どちらの答えも本当に素晴らしいです。ありがとうございました。次に、オブジェクト内で再帰関数または親関数を呼び出す問題を調べ、ここで解決策を見つけました。これにより、arguments.callee/callerプロパティを使用せずに関数名を取得できるようになります。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/function

4

2 に答える 2

4

関数に名前を付けます

お気に入り:

 var obj = function(){};

function apply(target, obj) {

    if (target && obj && typeof obj == "object") {
        for (var prop in obj) {
            target[prop] = obj[prop];
        }
    }

    return target;
}

apply(obj.prototype, {
    firstFunction: function   firstFunction(){
        this.secondFunction();
    },
    secondFunction: function    secondFunction(){
        // how do I know what function called me here?
        console.log("Callee Name: '" + arguments.callee.name + "'");
        console.log("Caller Name: '" + arguments.callee.caller.name + "'");
    }
});

var instance = new obj();

instance.firstFunction();

この質問を見てください

于 2012-09-13T18:54:53.463 に答える
4

関数の名前は、その関数の不変のプロパティであり、最初の関数式で設定されます。

var notTheName = function thisIsTheName() { ... }

someObj.stillNotTheName = function stillTheName() { ... }

関数式に名前がない場合、(当然のことながら)名前で識別する方法はありません。関数を変数に割り当てても、名前は付けられません。その場合、複数の変数に割り当てられた式の名前を判別できませんでした。

firstFunctionnameプロパティを次のように表現して設定する必要があります

firstFunction: function firstFunction(){
    this.secondFunction();
}

また、arguments.callee非推奨です。JavaScriptでarguments.callee.callerプロパティが非推奨になった理由を参照してください。の歴史の非常に良い説明のためにarguments.callee

于 2012-09-13T19:05:20.957 に答える