2015-04-01 12 views
5

Mir wurde gesagt, dass Sie immer Funktionen in JavaScript deklarieren müssen. Ist das wahr? Was ist der Vorteil davon?Warum deklarieren Sie immer Funktionen in JavaScript?

I zuweisen in der Regel Funktionen einer Variablen als solche:

var foo = function() {}; 

Aber angeblich ist dies falsch, etwas Stapelverfolgung zu tun. Kann mir bitte jemand erklären? Mir wurde gesagt, zu tun:

var foo = function fooBar() {}; 

Wäre es sinnvoll, wenn es zu einem Objekt zugewiesen wird?

Beachten Sie, dass diese Funktionen nicht innerhalb des globalen Gültigkeitsbereichs liegen und auch nicht selbst ausgeführt oder mehrfach verwendet werden.

+4

möglich Duplikat [var functionName- = function() {} vs function Funktions() {}] (http://stackoverflow.com/questions/336859/var-functionname-function-vs-function-functionname) –

+1

Scheint so, als ob deine Frage darin besteht, Funktionen einen Namen zu geben. Ja, das hilft bei der Stapelverfolgung, sodass Sie nicht nur eine Reihe von "anonymen Funktionen" -Einträgen sehen. – JAL

+0

@MikeRobinson, dass Fragen mehr über das Heben ist. Ich kenne den Unterschied zwischen diesen beiden Funktionen. Bitte lesen Sie die Frage noch einmal. – DevNoob

Antwort

3

Zunächst einmal eine kleine Anmerkung zur Terminologie: Was Sie haben, ist keine Funktionsdeklaration. Dies ist eine Funktionsdeklaration:

function fooBar() { 
} 

es eine Funktion fooBar zugänglich durch die variable fooBar genannt schafft. Dies ist eine Zuordnung eine benannte Funktion Ausdruck, der:

var foo = function fooBar() { 
}; 

Der Name der Funktion ist noch fooBar, aber die Funktion ist nur auf eine fooBar Variable innerhalb der Funktion selbst und nicht außerhalb gebunden. Die Tatsache, dass es die Funktion zugänglich in seinem Umfang nicht machen, ohne in einem äußeren Umfang eine Variablen beziehen zu benötigen, bedeutet aber, dass es zwei Gründe, es zu nennen:

  • Für die Fähigkeit, den Bezug zu nehmen Funktioniert in sich unabhängig vom Code in der äußeren Funktion!

    Dies kann zurückkehren, was die äußere Funktion will:

    function fooBar() { 
        return fooBar.toString(); 
    } 
    
    var baz = fooBar; 
    fooBar = 5; 
    baz(); // "5" 
    

    Dies ist immer konsistent:

    var fooBar = function fooBar() { 
        return fooBar.toString(); 
    }; 
    
    var baz = fooBar; 
    fooBar = 5; 
    baz(); // "function fooBar() { …" 
    
  • Und ja, für eine detailliertere Stack-Trace:

    function trace(func) { 
        try { 
         func(); 
        } catch (error) { 
         console.log(error.stack); 
        } 
    } 
    
    trace(function() { 
        throw new Error("Bad thing"); 
    }); 
    /* 
    Error: Bad thing 
        at /home/ryan/test.js:10:18 
        at trace (/home/ryan/test.js:3:16) 
        at Object.<anonymous> (/home/ryan/test.js:9:8) 
        at Module._compile (module.js:410:26) 
        at Object.Module._extensions..js (module.js:428:10) 
        at Module.load (module.js:335:32) 
        at Function.Module._load (module.js:290:12) 
        at Function.Module.runMain (module.js:451:10) 
        at startup (node.js:123:18) 
        at node.js:866:3 
    */ 
    
    trace(function descriptiveName() { 
        throw new Error("Bad thing"); 
    }); 
    /* 
    Error: Bad thing 
        at descriptiveName (/home/ryan/test.js:14:18) 
        at trace (/home/ryan/test.js:3:16) 
        at Object.<anonymous> (/home/ryan/test.js:13:8) 
        at Module._compile (module.js:410:26) 
        at Object.Module._extensions..js (module.js:428:10) 
        at Module.load (module.js:335:32) 
        at Function.Module._load (module.js:290:12) 
        at Function.Module.runMain (module.js:451:10) 
        at startup (node.js:123:18) 
        at node.js:866:3 
    */ 
    

    (Node.js hier abgebildet.) Notieren Sie sich die descriptiveName an der Spitze des zweiten Stack-Trace . Dies ist besonders praktisch, wenn Sie leicht komplizierte Systeme mit asynchronen Rückrufen, Ereignissen, Methoden für Objekte haben, die weitergegeben werden, und so weiter.

+0

Sie könnten vielleicht auch IIFE nennen, um zu beschreiben, was ein Codeblock tut. Z.B. '(function applyFixIfNeeded() {// fix in here}());' anstatt Kommentare zu verwenden, likes '// Dies wendet eine Korrektur mit folgendem Code an. Ich bevorzuge eigentlich, Funktionen unten zu deklarieren und sie oben aufzurufen, aber ich habe diese Form in der Vergangenheit benutzt. – plalx

Verwandte Themen