сохранить функцию в локальном хранилище

Я работаю с некоторыми объектами, которые содержат ряд данных, которые должны отображаться и обрабатываться из браузера, и я хочу сохранить их в локальном хранилище. Для сохранения объектов я использовал JSON.stringify (), чтобы все стало текстом, и это работает хорошо

{
"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"
}
}

Теперь я пытаюсь также сохранить функцию, преобразовав ее в строку, а затем сохранив ее

JSON.stringify(myFunction.toString());

но на выходе это

"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}"

Это правильный способ сохранить функцию в локальном хранилище или есть лучший способ сделать это? Если это правильный путь, есть ли способ просто удалить любой символ табуляции / отступа или я должен манипулировать строкой, например, с помощью некоторой функции регулярного выражения?

 nnnnnn16 июн. 2012 г., 14:58
Почему вы хотите сохранить функцию? На мой взгляд, нет «правильного» способ сделать это, потому что это действительно не имеет смысла делать это вообще. Предполагая, что вы хотите сохранить.toString() версия функции, почему вы хотите удалить вкладки (что вы могли бы сделать с.replace())?
 Sarfraz16 июн. 2012 г., 14:57
Вы хотите сохранить объект stringified или функцию подписи? Какой выход вы ожидаете?

Ответы на вопрос(2)

кции storage.set и storage.get вместо localStorage.set и localStorage.get(localStorage doesn't allow functions to be added, unlike JSON).

storage.set преобразует объект, включая функции, перед использованием localStorage.setItem ().
storage.get будет анализировать объект, включая функции, после использования localStorage.getItem ().

Я изменил функции JSON.stringify и JSON.parse, чтобы иметь возможность обрабатывать функции, чтобы вы могли использовать его в других частях вашего кода без изменения имен функций. Я добавил 2 к исходным функциям, чтобы я мог использовать их в обновленных функциях.

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;
    }
}
 03 сент. 2017 г., 06:18
Переопределять туземцев - плохая практика. Попробуйте создать новые функции.
Решение Вопроса

как и во многих функциональных языках, являются замыканиями: они обертывают в них содержимое области действия среды на момент определения, включая эфемерные данные, такие как db или дескрипторы файлов.

Это не очень хорошая идея, потому что это может привести к проблемам из-за поведения десериализации JSON, поэтому вы должны проверить, что в функции упаковано, а что самоопределяется.

Смотрите также этоТАК нить для дополнительной информации.

 Naigel16 июн. 2012 г., 15:10
полезная ссылка и полезный ответ, я постараюсь избежать сохранения функции. Спасибо

Ваш ответ на вопрос