Die Umsetzung und das Verständnis "memoize" - Funktion unterstreichen & lodash
Habe versucht zu lernen, mehr über die funktionale Programmierung, indem man die Unterstrich-Dokumentation und Versuch zu schreiben, meine eigenen Versionen der am häufigsten verwendeten Funktionen.
Kommen über "memoize" - ich hatte Probleme beim wickeln meinem Kopf herum, und fand einige Informationen, die in Crockford 's" Die Guten Teile".
_.memoize = function(func) {
//'cache' object is used to hold the result of the memoized fn's call
var cache = {};
var recur = function(n) {
var result = cache[n];
if (typeof result === 'undefined') {
result = func.apply(this, arguments);
cache[n] = result;
}
return result;
}
return recur;
};
Könnten Sie mir bitte helfen zu verstehen, wenn mein Gebrauch .bewerben war noch nötig und wenn es eine core-Verbesserung, die ich machen kann, um diesen code? Wirklich zu schätzen die Hilfe!
- Ja, die Verwendung von apply ist notwendig, weil Sie nicht wissen, wie viele Argumente
func
haben - So dass der code, den du geschrieben hast selber? Und es gibt nichts, was Sie nicht verstehen, über es? Oder welche Teile Unterstrich verstehen Sie nicht?
- Ich war in der Lage zu gelangen bei dieser Lösung ist, aber ich wollte sehen, ob es irgendwelche Fehler oder Verbesserungen, die ich machen könnte. Wie ich unten erwähnt habe ich seitdem geändert, die Verwendung von typeof und verlassen Sie sich auf hasOwnProperty statt. Jedoch, ich versuche, herauszufinden, wie kann ich verhindern, dass die memoized Funktion ausführen, die mehr Zeit als es braucht.
- Vielleicht war die Frage besser gestellt werden auf Code Überprüfen dann. Aber es ist OK.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einige offensichtliche Probleme mit der Korrektheit:
1) Sie speichern das Ergebnis basiert nur auf dem Wert der ersten argument, also den Aufruf einer Funktion mit unterschiedlichen Argumenten, wird ein Falsches Ergebnis!
2) verwenden Sie
undefined
darstellen, eine Funktion, die wurde nicht genannt, aberundefined
ist ein Gültiger Rückgabewert ist. Sehen Sie, wie die Nebenwirkung geschieht zweimal:Können Sie stattdessen verwenden
cache.hasOwnProperty
zu erkennen, wenn sich etwas im cache befindet.Würde ich empfehlen, für Sie zu schreiben, eine test-suite. Tests sind sehr wertvoll bei der Suche nach diesen Fehlern. Denken sich die anderen Sonderfälle, wo Ihre Funktion nicht ordnungsgemäß funktionieren. Standalone-utilities wie das wirklich eignen sich für test-driven coding.
if (!cache.hasOwnProperty(result)) {
var log = memoize(console.log.bind(console)); log("hasOwnProperty"); log("hasOwnProperty");