当前位置: 首页 > 面试题库 >

如何在JSON中存储JavaScript函数

陈朗
2023-03-14
问题内容

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

码:

JSON.stringify({
    a: 5,
    b: function (param) {
        return param;
    }
})

结果:

"{"a":5}"

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

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


问题答案:

通常,这样的问题表示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 (0, eval)("(" + value + ")");

  }

  return value;

});

document.body.innerHTML = obj2.b(42);

该构造(0, eval)("(" + value + ")");可确保eval在全局范围而不是在齐磊函数范围内运行。通常,它eval具有使用调用它的范围的魔术功能,但是仅在直接调用它时才有效。如图所示(或仅显示)的
间接evalvar e = eval; e("(" + value + ")");功能不具备这种魔术功能,它在全局范围内运行。



 类似资料:
  • 本文向大家介绍如何在JavaScript cookie中存储大数据?,包括了如何在JavaScript cookie中存储大数据?的使用技巧和注意事项,需要的朋友参考一下 要将较大的值存储在JavaScript cookie中,请尝试以下可能性- 创建一个“会话ID”,并将设置保存在数据库中。然后将会话ID存储在cookie中。 存储所选项目的索引。假设所选项目是列表中的前20个项目- 创建一个表

  • 问题内容: 如果我不需要localStorage,我的代码将如下所示: 这可行。但是,我需要将此变量存储在localStorage中,事实证明它很顽固。我试过了: 我要去哪里错了? 问题答案: 仅支持字符串。使用和。

  • 对于vue-axios auth by api_token,我使用助手文件api.js。

  • 我试图在我的云功能中访问Firebase云存储,但我一直在云功能日志中出现以下错误: 下面是我的代码: const admin=需要('Firebase-admin'); const函数=需要('Firebase-函数'); 下面是我的包中的依赖项。json: PS:我在星火计划上

  • 本文向大家介绍如何在MongoDB中使用存储的JavaScript?,包括了如何在MongoDB中使用存储的JavaScript?的使用技巧和注意事项,需要的朋友参考一下 它保存在特殊的system.js集合中。为此,请使用db.system.js.save()。以下是语法- 让我们实现以上语法。以下是查询- 以下是调用上述函数以打印实际数据的查询- 这将产生以下输出-

  • 问题内容: 如何在SQLite数据库中存储JSON对象?正确的方法是什么? 一个地方是Blob类型列。如果我可以将JSON对象转换为字节数组并使用Fileoutputstream 另一个想法是将文本列存储为字符串 问题答案: 将JSONObject转换为String并另存为TEXT / VARCHAR。 在检索同一列时,将String转换为JSONObject。 例如 写入数据库 从数据库读取