【问题标题】:save a function in localstorage在本地存储中保存一个函数
【发布时间】:2012-06-19 06:55:21
【问题描述】:

我正在处理一些对象,这些对象包含要从浏览器显示和操作的大量数据,并且我想将其保存在本地存储中。 为了保存对象,我使用了 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}"

将函数保存在本地存储中是正确的方法还是有更好的方法?如果这是正确的方法,有没有办法简单地删除任何制表/缩进字符或者我应该操纵字符串,例如使用一些正则表达式函数?

【问题讨论】:

  • 您想保存对象字符串化或函数签名?你期待什么输出?
  • 为什么要保存一个函数?在我看来,没有“正确”的方法可以做到这一点,因为这样做根本没有意义。假设您确实想保存函数的 .toString() 版本,为什么要删除选项卡(您可以使用 .replace() 执行此操作)?

标签: javascript json local-storage


【解决方案1】:

JS 中的函数与许多函数式语言一样是闭包:它们在定义时将环境范围的内容包装在其中,包括临时数据,如 db 或文件句柄。

这不是一个好主意,因为这可能会由于 JSON 反序列化行为而导致问题,因此您必须检查函数中的包装内容以及自定义内容。

另请参阅SO thread 了解更多信息。

【讨论】:

  • 有用的链接和有用的答案,我会尽量避免保存函数。谢谢
【解决方案2】:

您可以将函数放在一个对象中,并使用我创建的函数 storage.set 和 storage.get 而不是 localStorage.set 和 localStorage.get (localStorage 不允许添加函数,不像 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;
    }
}

【讨论】:

  • 覆盖本地人是一种不好的做法。请考虑创建新函数。
猜你喜欢
  • 2021-06-23
  • 2022-07-21
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多