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!
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