2015-07-22 9 views
5

In Douglas Crockford Buch schreibt er eine rekursive Funktion als:Was ist der Zweck von "bar" in "var foo = Funktionsleiste() {...}"?

var walk_the_DOM = function walk(node, func){ 
    func(node); 
    node = node.firstChild; 
    while(node){ 
     walk(node,func); 
     node = node.nextSibling; 
    } 
} 

Ich habe noch nie eine Funktion definiert als var foo = function bar(){...} gesehen - ich habe immer die richtige Seite der Erklärung gesehen werden anonymou als: var foo = function(){...}

Ist der einzige Zweck des Namens walk auf der rechten Seite der Deklaration, um den Aufruf von walk_the_DOM zu verkürzen? Sie scheinen getrennte Namen für eine identische Funktion zu werden. Vielleicht habe ich missverstanden, wie dieser Ausschnitt funktioniert.

Gibt es einen funktionalen Grund für die Benennung der Funktion sowohl in der Variablendeklaration als auch im Funktionskonstrukt?

+0

Ich bin übrigens nicht geschickt genug mit der Terminologie, aber vielleicht ist "Funktionskonstrukt" nicht das Richtige, um es zu nennen, ich hätte nichts dagegen, auch über diese Terminologie informiert zu werden. –

Antwort

4

Gibt es einen funktionalen Grund für die Benennung der Funktion sowohl in der Variablendeklaration als auch im Funktionskonstrukt?

Ja. function bar() {} bewirkt, dass die name -Eigenschaft der Funktion auf bar gesetzt wird, was zum Beispiel zum Debuggen in Stack-Traces nützlich sein kann.

einige der Namensgebung Verwirrung in Bezug auf die Sie erwähnt, könnte dies helfen:

function bar() {} 

^Dies ist eine Funktionsdeklaration, wie es im Rahmen eines Zuweisungsausdruck existiert nicht.

var foo = function() {}; 

^Dies ist ein Zuweisungsausdruck wo der rechte Operand ist ein Funktionsausdruck , und wobei die Funktion Ausdruck definiert eine anonyme Funktion.

var foo = function bar() {}; 

^Dies ist ein Zuweisungsausdruck wo der rechte Operand ist ein Funktionsausdruck , und wobei die Funktion Ausdruck definiert eine benannte Funktion.

Es ist wahrscheinlich erwähnenswert, dass Funktionsdeklarationen kann lokal durch ihre Funktionsnamen referenziert werden, so dass die folgenden Aussagen sind grob äquivalent:

function bar() {} 

var bar = function() {}; 

ich sagen grob äquivalent, da die zweite Aussage führt immer noch eine anonyme Funktion, anstatt eine namens Funktion. Es gibt auch einen kleinen Unterschied darin, wie Funktionsdeklarationen gehisst werden. Betrachten Sie die folgende, zum Beispiel:

function test() { 
    hello(); 

    var hello = function() { console.log('hello'); }; 
} 

test(); 
// > TypeError: hello is not a function 

Beachten Sie, dass hello technisch definiert wurde, wo wir es aufzurufen versucht (die Ausnahme einfach ist, dass es nicht eine Funktion (noch)).Dies ist auf das variable Heben zurückzuführen. Wie erwartet, haben wir jedoch unsere Funktion nicht der hello Variable zugewiesen. Das ist leichter zu zeigen als wirklich zu erklären. Im Wesentlichen aufgrund des Hochziehens, das obigen test Beispiel entspricht:

function test() { 
    var hello; // declared, but not assigned yet 

    hello(); 

    hello = function() { console.log('hello'); }; // now the assignment happens 
} 

vergleichen, die zu einer tatsächlichen Funktionsdeklaration:

function test() { 
    hello(); 

    function hello() { console.log('hello'); }; 
} 

test(); 
// > "hello" 

Beachten Sie, dass, obwohl die Erklärung unten der Aufrufbefehl, es funktioniert immer noch, weil Funktionsdeklarationen als Ganzes an die Spitze ihres Geltungsbereichs gehievt werden (in diesem Fall test).

Wenn das verwirrend ist, ist hier eine verkürzte Beschreibung des Verhaltens, die helfen könnten: Erklärungen gehisst erhalten, nicht Zuweisungen. Solange Sie den Unterschied zwischen Funktionsdeklarationen und Funktionsausdrücken verstehen, ist dies alles, was Sie wissen müssen. :)

+0

Wow, deine Erklärung hat Wunder gewirkt. –

2

Indem Sie var foo = function(){...} schreiben, deklarieren Sie eine Variable namens foo, die eine anonyme Funktion enthält. Indem Sie var foo = function bar(){...} schreiben, deklarieren Sie eine Variable mit dem Namen foo, die eine benannte Funktion als bar enthält. Wie @ jmar777 in seiner Antwort darauf hingewiesen hat, ist dies nützlich, um Stack-Traces beim Debuggen und bei der Fehlerbehebung zu verfolgen.

Verwandte Themen