如何在JSON中存储javascript函数

Ami*_*mit 35 javascript json

我有一个JS对象,我想保存在本地存储中供将来使用,我无法将其解析为字符串.

码:

JSON.stringify({
    a: 5,
    b: function (param) {
        return param;
    }
})
Run Code Online (Sandbox Code Playgroud)

结果:

"{"a":5}"
Run Code Online (Sandbox Code Playgroud)

如果不使用JSON,如何保存以备将来使用?

(并创建我自己的Lexer-Parser以中断字符串函数我不认为是一个选项)

T.J*_*der 39

通常这样的问题表明X/Y问题:你需要做X,你认为Y会帮助你这样做,所以你试着做Y,不能,并且问如何做Y.它会经常更多对于询问如何做X而言非常有用.

但回答问题:您可以使用replacer和reviver函数将函数转换为字符串(期间stringify)并返回函数(期间parse)以存储函数的字符串版本,但是这样做有各种各样的问题尤其是定义函数的范围可能对函数很重要.(这与您在问题中显示的功能无关,但我认为这并不具有代表性.)将字符串从本地存储转换为可能运行的代码意味着您相信本地存储内容没有'被恶意破坏了.除非该页面已经容易受到XSS攻击,否则它是不可能的,但要记住这是一个问题.

这是一个例子,但我不推荐它,除非其他选项已经用尽,尤其是因为它使用eval,它(如它的近亲new Function)可以是恶意代码的向量:

// The object
var obj = {
    a: 5,
    b: function (param) {
        return param;
    }
};

// Convert to JSON using a replacer function to output
// the string version of a function with /Function(
// in front and )/ at the end.
var json = JSON.stringify(obj, function(key, value) {
  if (typeof value === "function") {
    return "/Function(" + value.toString() + ")/";
  }
  return value;
});

// Convert to an object using a reviver function that
// recognizes the /Function(...)/ value and converts it
// into a function via -shudder- `eval`.
var obj2 = JSON.parse(json, function(key, value) {
  if (typeof value === "string" &&
      value.startsWith("/Function(") &&
      value.endsWith(")/")) {
    value = value.substring(10, value.length - 2);
    return eval("(" + value + ")");
  }
  return value;
});
document.body.innerHTML = obj2.b(42);
Run Code Online (Sandbox Code Playgroud)


Kos*_*tyn 25

我推荐这种方法:

将参数和正文存储在json中:

{"function":{"arguments":"a,b,c","body":"return a*b+c;"}}
Run Code Online (Sandbox Code Playgroud)

现在解析json并实例化该函数:

var f = new Function(function.arguments, function.body);
Run Code Online (Sandbox Code Playgroud)

我认为这是拯救

  • 这帮助我解决了一个几乎不相关的问题。谢谢! (2认同)

den*_*han 16

您无法在JSON中存储函数.

在JSON的值可能只包含字符串,号码,对象,阵列,true,falsenull:

在此输入图像描述

在JSON网站上查看它.

  • @denysdovhan - 哦,不是,但"可怕的想法"离"不可能"还有很长的路要走 (17认同)
  • "无法在JSON中存储函数." - 事实并非如此.这只表明没有本机功能数据类型.函数可以表示为字符串. (7认同)
  • 这个答案在技术上是正确的IMO。您不是在存储函数,而是在存储可以评估为函数的字符串。 (2认同)

Red*_*edu 5

一种简单的方法是

var dstr = JSON.stringify( { a: 5
                           , b: x => x
                           }
                         , (k,v) => typeof v === "function" ? "" + v : v
                         );
Run Code Online (Sandbox Code Playgroud)

  • 另外,反过来就是 `JSON.parse(json, (k,v) => typeof v === "string"? (v.startsWith('function')? eval("("+v+")") : v): v)` (2认同)