2016-05-19 11 views

Antwort

9

Es ist wichtig, dass Menschen den Wert von Funktionen verstehen, die Funktionen zurückgeben; Mit dieser Technik können Sie Code sparen, JavaScript-Effizienz und ein Verständnis dafür, wie mächtig JavaScript sein kann.
Ich habe ein schnelles Beispiel erstellt, das ich Ihnen zeigen möchte, damit Sie die Idee bekommen können, die ich versuchte zu kommunizieren.

Angenommen, Sie haben ein Host-Objekt mit zwei untergeordneten Objekte haben, die beide mit Get-Methoden, und beide tun genau die gleiche Aufgabe, aber mit einem anderen Attribut:

var accessors = { 
    sortable: { 
     get: function() { 
      return typeof this.getAttribute('sortable') != 'undefined'; 
     } 
    }, 
    droppable: { 
     get: function() { 
      return typeof this.getAttribute('droppable') != 'undefined'; 
     } 
    } 
}; 

den gleichen Code zu wiederholen ist nicht ideal, so konnten wir eine externe Funktion zu erstellen, ist es ein Attribut Argument übergeben:

function getAttribute(attr) { 
    return typeof this.getAttribute(attr) != 'undefined'; 
} 

var accessors = { 
    sortable: { 
     get: function() { 
      return getAttribute('sortable'); 
     } 
    }, 
    droppable: { 
     get: function() { 
      return getAttribute('droppable'); 
     } 
    } 
}; 

das viel besser ist, aber immer noch nicht ideal, weil es eine zusätzliche Zwischenfunktionsausführung jedesmal, wenn die Methode aufgerufen wird.
Was würde am besten funktioniert, ist eine Funktion, die die endgültige Funktion zurückgegeben - dass die zusätzliche Funktion Ausführung bei jedem Aufruf beseitigen würde zu bekommen:

function generateGetMethod(attr) { 
    return function() { 
     return typeof this.getAttribute(attr) != 'undefined'; 
    }; 
} 

var accessors = { 
    sortable: { 
     get: generateGetMethod('sortable') 
    }, 
    droppable: { 
     get: generateGetMethod('droppable') 
    } 
}; 

siehe oben Was Sie eine Funktion ist eine Funktion zurückkehrt; Jede Methode erhält ihre eigene Methode, um die Eigenschaft zu erhalten, und es gibt keinen Overhead bei jedem Aufruf.

Dies ist eine wirklich nützliche Technik, die Sie davon abhält, ebenfalls Code zu wiederholen und bei richtiger Anwendung leicht zu verstehen und zu pflegen!

+0

Hallo, ich kam zurück, um diese Antwort noch einmal zu lesen und merke, dass ich immer noch verwirrt bin. Was wäre, wenn Sie in v2 des Codebeispiels nur "get: getAttribute ('sortable')" hätten? Wäre es nicht das gleiche Ergebnis? als "get: generateGetMethod ('sortierbar')" – Synia

1

Es gibt viele Fälle, in denen Sie eine Funktion zurückgeben möchten. In dieser Situation geht es speziell darum, wie kantig Filter definiert sind. Die äußere Funktion soll alle Abhängigkeiten behandeln, die möglicherweise injiziert werden müssen, oder irgendwelche Variablen, die möglicherweise spezifiziert werden müssen. Die innere Funktion ist der eigentliche Filterschritt, der auf eine Sammlung angewendet wird, um eine kleinere Sammlung zurückzugeben.

1

Alle funktionalen Sprachen und damit JavaScript ermöglicht ** Higher order functions *, wobei Funktionen als erste Klassenmitglieder der Sprache behandelt werden und von einer anderen Funktion zurückgegeben oder als Parameter an andere Funktionen übergeben werden können. Dies ermöglicht eine viel Kraft in der Sprache ermöglicht Dinge wie:

  1. Closures: Verschlüsse sind wieder andere Art von Tier und fügt eine Menge Energie, um die asynchrone Programmierung über Rückrufe. Sie können hier mehr über Schließungen lesen: https://developer.mozilla.org/en/docs/Web/JavaScript/Closures

  2. Abstraktion: Wenn Sie eine Funktion Belichtungs nur bestimmten Teil der Funktionalität zurückkehren, können Sie immer einen Teil davon verstecken lokalen Variablen.Dies ermöglicht eine Abstraktion in einer Sprache wie Javascript, wobei Sie nicht public, private Zugriffsbezeichner haben als in anderen Sprachen wie Java oder C#

  3. Currying: Sie implementieren können durch Rücksendung Funktionen in Javascript currying auf ausgewählten Attribute angewendet . Z.B. Definieren Sie eine Funktionssumme, sodass die Parameter teilweise angewendet werden können. sum(3)(4)

    function sum (a) { 
        return function (b) { 
        return a + b; 
        } 
    } 
    
  4. Werksmuster: Sie können die Funktionen höherer Ordnung verwenden Funktionen zu erzeugen und die Funktion als Fabrik

Es gibt viele andere Funktionen in JavaScript-Sprache möglich, nur wegen der Verwendung Fähigkeit, Funktionen zurückzugeben.

Verwandte Themen