• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Funktionsnamen herausfinden

nrg_

New member
Hallo Zusammen,

ich würde gerne ein Tracelogging einbauen und dazu muss ich den Namen der übergebenen Funktion auslesen:

Code:
function trace(func) {
	alert func.name;
}

Das funktioniert für so eine Function ganz gut:
Code:
function foo() {
	trace(foo);
}

Bei Konstruktorfunktionen und Closures komme ich aber an meine Grenzen:
Code:
function Foo() {
	this.foo = function() {
		// functioniert nicht. sollte einfach in der Funktion trace "foo" ausgeben
		trace(this.foo);
	};
}

var Foo = (function () {
	return {
		foo : function() {
			// functioniert ebenfalls nicht. sollte auch in trace "foo" ausgeben
			trace(this.foo);
		}
	};
})();


hat jemand eine Idee, wie ich in diesen Fällen an den Namen komme?

Meine jetzige Lösung ist:
trace(this.foo, "foo");

was ich doof finde...

Danke und Grüße
nrg
 
Du musst der Funktion einen namen zuweisen.
eval wo, kannst du einen Namen einbauen.
Sei es über: this.name = "NAME" oder function NAME().

Eine andere Möglichkeit wäre, wenn du nur in dei Console schreiben willst, den prototype davon auszugeben. da sollte dann Foo.foo {} stehen.
 
naja dann kann ich's auch gleich der Funktion mit übergeben.

Dachte mir schon fast, dass das nicht gehen wird. In den Fällen ist ja der Funktionsname ganz einfach ein Variablenname. Der Inhalt einer Variable, kann ja nicht wissen, wo er referenziert ist.

Trotzdem danke.
 
Übergib einfach den Kontext als zweites Argument und mach dann eine Fallunterscheidung in trace.

Code:
function trace(fn, ctx) {
    if (fn.name) {
        alert(fn.name);
    } else {
        for (var x in ctx) {
            if (ctx[x] === fn) {
                alert(x);
            }
        }
    }
    
}

Dann funktionieren alle deine drei Fälle.

Code:
/** Fall 1: */
function foo1() {
    // hier ist der Kontext egal, es wird aber keinen Unterschied machen wenn du ihn mit angibst
    trace(foo1 /*, this */);
}

foo1();

/** Fall 2: */
function Foo2() {
    this.bar = function () {
        trace(this.bar, this);
    };
}

(new Foo2()).bar();

/** Fall 3: */
var foo3 = (function () {
    return {
        bar: function () {
            trace(this.bar, this);
        }
    };
})();

foo3.bar();
 
Zurück
Oben