2 Stimmen

anonyme und benannte Funktionen bezweifeln

Bei der Fehlersuche habe ich festgestellt, dass diese Art von Funktionen:

var f = function() {};

Im Stacktrace von Firebug oder Webkits Dev-Konsole erscheinen als anonymous und das zu Recht.

Ich habe auch gesehen, dass die Leute diese als definieren:

var someName = function otherName(){};

Die ziemlich seltsam sind. Beachten Sie, dass Sie hier nicht aufrufen können otherName() von überall sondern der Körper von otherName selbst. Von überall sonst müssen Sie someName() .

Meine Fragen sind:

  • Ist es problematisch, eine Funktion anders zu benennen als die Variable, in der sie gespeichert ist?

  • Hat var a = function a(){} irgendeinen Unterschied macht, außer dass der Name im Stacktrace angezeigt wird?

  • Jeder andere Tipp/Vorschlag zu diesem Thema :)

3voto

Ray Toal Punkte 82654

Es gibt kein Problem mit der Zuweisung einer Funktion namens f auf eine Variable namens a .

Eine gute Referenz über Funktionen ist https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope . Von besonderem Interesse ist der Abschnitt "Funktionskonstruktor vs. Funktionsdeklaration vs. Funktionsausdruck", in dem der Unterschied zwischen dem Funktionsnamen und der Variablen, der die Funktion zugewiesen ist, ausführlich diskutiert wird. (Vielleicht haben Sie das schon gesehen.)

Ich vermute, der Grund dafür, dass der Debugger etwas ausgibt wie

var a = function a() {}

ist, dass der Name der Funktion erscheint, wenn der Funktionswert selbst serialisiert wird. Der Debugger gibt Ihnen alle Informationen, die er hat.

1voto

katspaugh Punkte 16624

Beachten Sie, dass Sie hier otherName() nicht von irgendwo anders als dem Körper von otherName selbst aufrufen können.

Nicht im IE (einschließlich IE8).

Voir http://kangax.github.com/nfe/#jscript-bugs für weitere benannte Funktionsfehler, sehr schöner Artikel.

0voto

brymck Punkte 7434

Nicht wirklich. Mit var a = function b() {} die genannte Funktion ist nicht hochgezogen und ihr Prototyp ist nicht sinnvoll veränderbar. Nehmen Sie zum Beispiel den folgenden Code:

function foo() {
}
foo.prototype.bar = "hi";

var a = new foo();         // this inherits from function foo() above
var b = function foo() {}; // this has nothing to do with the above

console.log(a.bar); // returns "hi" due to inheritance
console.log(b.bar); // returns undefined; its prototype is a new named
                    // function

var c = function() {};
var d = function d() {};

console.log(c.name); // returns ""
console.log(d.name); // returns "d"

AFAICT, die wichtigste nützliche Methode ist, die name leicht zugänglich (meist für die var a = function a(){} Form), die könnte in einigen Randfällen hilfreich sein, ich denke vor allem bei der Fehlerbehandlung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X