2016-04-25 5 views
2

Ich möchte ein localStorage-Element als eine Funktion festlegen, aber wenn ich es mache, wird es als Zeichenfolge gespeichert.Wie wird ein localStorage-Element als Funktion festgelegt?

localStorage.getData = function (key="def") { 
    let data = null; 

    if (this[key] && !_this.isDataAvailableInList(this[key])) { 
    data = this[key].data; 
    } 

    return data; 
}; 

Die obige Funktion wird als String gespeichert und funktioniert nicht.

Hinweis: Bitte geben Sie keine Alternativen oder andere Vorschläge, ich bin mir bewusst Alternativen und bin neugierig zu wissen, wie das funktioniert. Ich habe nicht den gesamten Kontext bereitgestellt, also nehmen wir an, ich brauche ein LocalStorage-Element als Funktion

+0

müssen Sie immer den statischen Schlüssel "def" übergeben? –

+0

nur eval die Zeichenfolge (mit einem paren Wrap oder '0 ||' Header) und aus kommt eine Funktion: 'eval (" (Funktion (a, b) {return a + b}) ") (6,4)' – dandavis

Antwort

1

Setzen Sie die Funktion in eine Zeichenfolge über .toString(). Wenn Sie es lesen, konvertieren Sie es zurück in eine Funktion über new Function(myString).

Beispiel:

Keine pamameters:

(new Function('var a = 0; return a + 1;'))() === 1

Mit den Parametern:

(new Function(['param0'],'var a = param0; return a + 1;'))(100) === 101

Hinweis: Der Umfang der ursprünglichen Funktion verloren.

+0

Können Sie bitte ein einfaches JSBin-Beispiel angeben? Ich konnte dein Beispiel nicht richtig funktionieren – wallop

2

Leider ist lokaler Speicher nur über Zeichenketten. Auch Arrays oder andere Daten werden immer in Strings konvertiert.

Für die meisten toten Daten ohne Zyklen Sie natürlich nutzen können JSON.stringify und JSON.parse, aber in anderen Fällen oder für Code oder andere Javascript Einheiten wird nicht von JSON (wie Infinity oder undefined) Sie brauchen, um sich zu serialisieren und deserialisieren.

Javascript bietet eval, so können Sie die Funktion speichern f es zuerst in einen String mit f+"" Umwandlung und die Funktion mit eval(s) zurück. Dies funktioniert jedoch nicht mit Schließungen und außerdem können Sie nicht einmal wissen, ob eine Funktion tatsächlich eine Schließung oder nicht in Javascript ist (Sie können also nicht einmal einen Fehler melden, wenn der unmögliche Vorgang des Serialisierens einer Schließung versucht wird).

+0

Ja, ich habe versucht, eval, aber danke für die detaillierte Erklärung. Können Sie bitte ein einfaches JSBin-Beispiel angeben? Seit Eval versuchte ich Probleme zu verursachen – wallop