2012-06-16 12 views
6

Sto lavorando con alcuni oggetti che contengono un numero di dati da visualizzare e manipolare dal browser e voglio salvarlo nella memoria locale. Al fine di salvare gli oggetti che ho usato JSON.stringify() in modo di testo tutto diventerà, e funziona benesalvare una funzione nella dimensione locale

{ 
"bindingRef": [], 
"primo": { 
    "name": "primo", 
    "modifiable": true, 
    "binded": false, 
    "isInteger": false, 
    "label": "Numero di Primi" 
}, 
"secondo": { 
    "name": "secondo", 
    "modifiable": true, 
    "binded": false, 
    "isInteger": false, 
    "label": "Numero di Secondi" 
} 
} 

Ora sto cercando di salvare anche una funzione convertendolo in una stringa e poi saveing ​​esso

JSON.stringify(myFunction.toString()); 

ma l'uscita è questo

"savedFunction": "function() {\n\t\t\t\tvar tot = menu.primo.get() * 6 + menu.secondo.get() * 8 + menu.dolce.get() * 4;\n\t\t\t\tif (menu.sconto.get()) {\n\t\t\t\t\treturn tot * 0.90;\n\t\t\t\t} else {\n\t\t\t\t\treturn tot;\n\t\t\t\t}\n\t\t\t}" 

e 'il modo corretto per salvare una funzione in memoria locale o c'è un modo migliore per fare questo? Se questo è il modo corretto, c'è un modo per rimuovere semplicemente qualsiasi carattere di tabulazione/indentazione o dovrei manipolare la stringa, ad esempio usando una qualche funzione regexp?

+0

Si desidera salvare l'oggetto stringificato o la firma della funzione? Quale risultato ti aspetti? – Sarfraz

+0

Perché vuoi salvare una funzione? Secondo me non esiste un modo "corretto" per farlo, perché non ha proprio senso farlo. Supponendo che si desideri salvare la versione '.toString()' della funzione, perché si desidera rimuovere le schede (cosa che si potrebbe fare con '.replace()')? – nnnnnn

risposta

5

La funzione in JS come in molti linguaggi funzionali sono le chiusure: racchiudono al loro interno il contenuto dello scope dell'ambiente al momento della definizione, inclusi dati effimeri come db o handle di file.

Non è una buona idea perché questo può portare a problemi dovuti al comportamento di deserializzazione JSON, quindi è necessario controllare cosa nella funzione è stata spostata e cosa è definito automaticamente.

Vedere anche questo SO thread per ulteriori informazioni.

+0

link utile e risposta utile, cercherò di evitare di salvare una funzione. grazie – Naigel

1

È possibile inserire la funzione in un oggetto e utilizzare le funzioni storage.set e storage.get che ho creato anziché localStorage.set e localStorage.get (localStorage non consente l'aggiunta di funzioni, diversamente da JSON).

storage.set eseguirà la stringa di un oggetto che include le funzioni prima di utilizzare localStorage.setItem().
storage.get analizzerà un oggetto incluse le funzioni dopo aver usato localStorage.getItem().

Ho modificato le funzioni JSON.stringify e JSON.parse per poter gestire le funzioni, quindi è possibile utilizzarlo in altre parti del codice senza modificare i nomi delle funzioni. Ho aggiunto un 2 alle funzioni originali, quindi posso usarle all'interno delle funzioni aggiornate.

JSON.stringify2 = JSON.stringify; 
JSON.parse2 = JSON.parse; 

JSON.stringify = function(value) { 
    return JSON.stringify2(value, function(key, val) { 
     return (typeof val === 'function') ? val.toString().replace(/\t|\n/g, '') : val; 
    }); 
} 

JSON.parse = function(value) { 
    return JSON.parse2(value, function(key, val) { 
     if (typeof val === 'string') { 
      var regex = /^function\s*\([^()]*\)\s*{.*}$/; 

      if (regex.exec(val) !== null) 
       return eval('key = ' + val); 
      else 
       return val; 
     } else 
      return val; 
    }); 
} 

var storage = {}; 

storage.set = function(key, value) { 
    if (typeof value === 'object') 
     value = JSON.stringify(value); 

    localStorage.setItem(key, value); 
} 

storage.get = function(key) { 
    var value = localStorage.getItem(key); 

    try { 
     return JSON.parse(value); 
    } catch (e) { 
     return value; 
    } 
} 
+0

Ignorare i nativi è una cattiva pratica. Prendi in considerazione la creazione di nuove funzioni. – neeh

Problemi correlati