7585 Stimmen

var Funktionsname = function() {} vs function Funktionsname() {}

Ich habe vor kurzem damit begonnen, den JavaScript-Code von jemand anderem zu pflegen. Ich behebe Fehler, füge Funktionen hinzu und versuche, den Code aufzuräumen und konsistenter zu machen.

Der vorherige Entwickler verwendete zwei Arten, Funktionen zu deklarieren, und ich kann nicht herausfinden, ob es einen Grund dafür gibt oder nicht.

Es gibt zwei Möglichkeiten:

var functionOne = function() {
    // Some code
};

function functionTwo() {
    // Some code
}

Was sind die Gründe für die Verwendung dieser beiden unterschiedlichen Methoden und was sind die Vor- und Nachteile der jeweiligen Methode? Gibt es irgendetwas, das mit der einen Methode gemacht werden kann, was mit der anderen nicht möglich ist?

126voto

suhailvs Punkte 17111

Eine bessere Erklärung für Gregs Antwort

functionTwo();
function functionTwo() {
}

Warum kein Fehler? Uns wurde immer beigebracht, dass Ausdrücke von oben nach unten ausgeführt werden(??)

Weil:

Funktionsdeklarationen und Variablendeklarationen werden immer verschoben ( hoisted ), die vom JavaScript-Interpreter unsichtbar an den Anfang des Bereichs gesetzt werden, der sie enthält. Funktionsparameter und sprachdefinierte Namen sind natürlich bereits vorhanden. Ben Cherry

Dies bedeutet, dass Code wie dieser:

functionOne();                  ---------------      var functionOne;
                                | is actually |      functionOne();
var functionOne = function(){   | interpreted |-->
};                              |    like     |      functionOne = function(){
                                ---------------      };

Beachten Sie, dass der Abtretungsteil der Erklärungen nicht angehoben wurde. Nur der Name wird angehoben.

Im Falle von Funktionsdeklarationen wird jedoch der gesamte Funktionskörper mit hochgezogen :

functionTwo();              ---------------      function functionTwo() {
                            | is actually |      };
function functionTwo() {    | interpreted |-->
}                           |    like     |      functionTwo();
                            ---------------

107voto

Sean McMillan Punkte 9808

Andere Kommentatoren haben bereits auf den semantischen Unterschied zwischen den beiden Varianten hingewiesen. Ich wollte auf einen stilistischen Unterschied hinweisen: Nur die Variante "Zuweisung" kann eine Eigenschaft eines anderen Objekts festlegen.

Ich erstelle oft JavaScript-Module nach diesem Muster:

(function(){
    var exports = {};

    function privateUtil() {
            ...
    }

    exports.publicUtil = function() {
            ...
    };

    return exports;
})();

Bei diesem Muster verwenden Ihre öffentlichen Funktionen alle Zuweisungen, während Ihre privaten Funktionen Deklarationen verwenden.

(Beachten Sie auch, dass eine Zuweisung ein Semikolon nach der Anweisung erfordern sollte, während eine Deklaration dies nicht zulässt).

91voto

Mbengue Assane Punkte 2755

Ein Beispiel dafür, wann man die erste Methode der zweiten vorziehen sollte, ist, wenn man vermeiden muss, die vorherigen Definitionen einer Funktion zu überschreiben.

Mit

if (condition){
    function myfunction(){
        // Some code
    }
}

ist diese Definition von myfunction hat Vorrang vor allen anderen Definitionen, da sie zur Parse-Zeit durchgeführt wird.

Während

if (condition){
    var myfunction = function (){
        // Some code
    }
}

die richtige Definition von myfunction nur wenn condition erfüllt ist.

73voto

Rob Punkte 5405

Ein wichtiger Grund ist, dass Sie eine und nur eine Variable als "Root" Ihres Namespaces hinzufügen...

var MyNamespace = {}
MyNamespace.foo= function() {

}

ou

var MyNamespace = {
  foo: function() {
  },
  ...
}

Es gibt viele Techniken für Namespacing. Mit der Fülle der verfügbaren JavaScript-Module ist es noch wichtiger geworden.

Siehe auch Wie deklariere ich einen Namespace in JavaScript?

64voto

Yash Punkte 8318

Heben ist die Aktion des JavaScript-Interpreters, alle Variablen- und Funktionsdeklarationen an den Anfang des aktuellen Bereichs zu verschieben.

Es werden jedoch nur die eigentlichen Erklärungen angehoben, indem die Zuweisungen dort belassen werden, wo sie sind.

  • Variablen/Funktionen, die innerhalb der Seite deklariert werden, sind global und können überall auf der Seite aufgerufen werden.
  • Variablen/Funktionen, die innerhalb der Funktion deklariert sind, haben einen lokalen Geltungsbereich, d.h. sie sind innerhalb des Funktionskörpers (Geltungsbereich) verfügbar/zugreifbar, außerhalb des Funktionskörpers sind sie nicht verfügbar.

Variabel

Javascript wird als lose typisierte Sprache bezeichnet. Das bedeutet, dass Javascript-Variablen den Wert einer beliebigen Datentyp . Javascript kümmert sich automatisch um die Änderung des Variablentyps auf der Grundlage des zur Laufzeit bereitgestellten Werts/Literal.

global_Page = 10;                                               var global_Page;      « undefined
    « Integer literal, Number Type.   -------------------       global_Page = 10;     « Number         
global_Page = 'Yash';                 |   Interpreted   |       global_Page = 'Yash'; « String
    « String literal, String Type.    «       AS        «       global_Page = true;   « Boolean 
var global_Page = true;               |                 |       global_Page = function (){          « function
    « Boolean Type                    -------------------                 var local_functionblock;  « undefined
global_Page = function (){                                                local_functionblock = 777;« Number
    var local_functionblock = 777;                              };  
    // Assigning function as a data.
};  

Funktion

function Identifier_opt ( FormalParameterList_opt ) { 
      FunctionBody | sequence of statements

      « return;  Default undefined
      « return 'some data';
}
  • Funktionen, die innerhalb der Seite deklariert werden, werden an den Anfang der Seite gehievt und haben globalen Zugriff.
  • Funktionen, die innerhalb des Funktionsblocks deklariert sind, werden an den Anfang des Blocks gehievt.
  • Der Standardrückgabewert der Funktion ist ' undefiniert ', Variabel Deklaration Standardwert ebenfalls 'undefiniert'

    Scope with respect to function-block global. 
    Scope with respect to page undefined | not available.

Funktionserklärung

function globalAccess() {                                  function globalAccess() {      
}                                  -------------------     }
globalAccess();                    |                 |     function globalAccess() { « Re-Defined / overridden.
localAccess();                     «   Hoisted  As   «         function localAccess() {
function globalAccess() {          |                 |         }
     localAccess();                -------------------         localAccess(); « function accessed with in globalAccess() only.
     function localAccess() {                              }
     }                                                     globalAccess();
}                                                          localAccess(); « ReferenceError as the function is not defined

Funktion Ausdruck

        10;                 « literal
       (10);                « Expression                (10).toString() -> '10'
var a;                      
    a = 10;                 « Expression var              a.toString()  -> '10'
(function invoke() {        « Expression Function
 console.log('Self Invoking');                      (function () {
});                                                               }) () -> 'Self Invoking'

var f; 
    f = function (){        « Expression var Function
    console.log('var Function');                                   f ()  -> 'var Function'
    };

Funktion, die einer Variablen zugeordnet ist Beispiel:

(function selfExecuting(){
    console.log('IIFE - Immediately-Invoked Function Expression');
}());

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

var namedExpression = function for_InternalUSE(fact){
    if(fact === 1){
        return 1;
    }

    var localExpression = function(){
        console.log('Local to the parent Function Scope');
    };
    globalExpression = function(){ 
        console.log('creates a new global variable, then assigned this function.');
    };

    //return; //undefined.
    return fact * for_InternalUSE( fact - 1);   
};

namedExpression();
globalExpression();

Javascript interpretiert als

var anonymous;
var namedExpression;
var globalExpression;

anonymous = function (){
    console.log('anonymous function Expression');
};

namedExpression = function for_InternalUSE(fact){
    var localExpression;

    if(fact === 1){
        return 1;
    }
    localExpression = function(){
        console.log('Local to the parent Function Scope');
    };
    globalExpression = function(){ 
        console.log('creates a new global variable, then assigned this function.');
    };

    return fact * for_InternalUSE( fact - 1);    // DEFAULT UNDEFINED.
};

namedExpression(10);
globalExpression();

Sie können die Funktionsdeklaration und den Ausdruckstest in verschiedenen Browsern überprüfen, indem Sie jsperf Test Runner


ES5-Konstruktorfunktionsklassen : Funktionsobjekte, die mit Function.prototype.bind erstellt wurden

JavaScript behandelt Funktionen als Objekte erster Klasse. Da sie ein Objekt sind, können Sie einer Funktion Eigenschaften zuweisen.

function Shape(id) { // Function Declaration
    this.id = id;
};
    // Adding a prototyped method to a function.
    Shape.prototype.getID = function () {
        return this.id;
    };
    Shape.prototype.setID = function ( id ) {
        this.id = id;
    };

var expFn = Shape; // Function Expression

var funObj = new Shape( ); // Function Object
funObj.hasOwnProperty('prototype'); // false
funObj.setID( 10 );
console.log( funObj.getID() ); // 10

ES6 eingeführt Pfeil-Funktion : Ein Pfeilfunktionsausdruck hat eine kürzere Syntax, ist am besten für Nicht-Methodenfunktionen geeignet und kann nicht als Konstruktor verwendet werden.

ArrowFunction : ArrowParameters => ConciseBody .

const fn = (item) => { return item & 1 ? 'Odd' : 'Even'; };
console.log( fn(2) ); // Even
console.log( fn(3) ); // Odd

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