iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >怎么用javascript存储函数
  • 740
分享到

怎么用javascript存储函数

2023-06-21 22:06:05 740人浏览 独家记忆
摘要

本篇内容主要讲解“怎么用javascript存储函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用javascript存储函数”吧!背景介绍我们都知道要想搭建一个前端页面基本需要如下3个要

本篇内容主要讲解“怎么用javascript存储函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用javascript存储函数”吧!

背景介绍

我们都知道要想搭建一个前端页面基本需要如下3个要素:

  • 元素(UI)

  • 数据(Data)

  • 事件/交互(Event)

在 数据驱动视图 的时代, 这三个要素的关系往往如下图所示:

怎么用javascript存储函数

可视化搭建平台的设计思路往往也是基于上面的过程展开的, 我们需要提供编辑器环境给用户来创建视图和交互, 最终用户保存的产物可能是这样的:

{    "name": "Dooring表单",    "bGColor": "#666",    "share_url": "Http://xxx.cn",    "mount_event": [        {            "id": "123",            "func": () => {                // 初始化逻辑                GamepadHapticActuator();            },            "sourcedata": []        }    ],    "body": [        {            "name": "header",            "event": [                {                    "id": "123",                    "type": "click",                    "func": () => {                        // 组件自定义交互逻辑                        showModal();                    }                }            ]        }    ]}

那么问题来了, JSON 字符串我们好保存(可以通过jsON.stringify序列化的方式), 但是如何将函数也一起保存呢? 保存好了函数如何在页面渲染的时候能正常让 js 运行这个函数呢?

实现方案思考

怎么用javascript存储函数

我们都知道将 js 对象转化为json 可以用 JSON.stringify 来实现, 但是它也会有局限性, 比如:

  1. 转换值如果有 toJSON() 方法,那么由 toJson() 定义什么值将被序列化

  2. 数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中

  3. 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值

  4. undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。函数、undefined 被单独转换时,会返回 undefined,如JSON.stringify(function(){}) or JSON.stringify(undefined)

  5. 所有以 symbol 为属性键的属性都会被完全忽略掉,即便 replacer 参数中强制指定包含了它们

  6. Date 日期调用了 toJSON() 将其转换为了 string 字符串(同Date.toISOString()),因此会被当做字符串处理

  7. NaN 和 Infinity 格式的数值及 null 都会被当做 null

  8. 其他类型的对象,包括 Map/Set/WeakMap/WeakSet,仅会序列化可枚举的属性

我们可以看到第4条, 如果我们序列化的对象中有函数, 它将会被忽略! 所以常理上我们使用JSON.stringify 是无法保存函数的, 那还有其他办法吗?

也许大家会想到先将函数转换成字符串, 再用 JSON.stringify 序列化后保存到后端, 最后在组件使用的时候再用 eval 或者 Function 将字符串转换成函数. 大致流程如下:

怎么用javascript存储函数

不错, 理想很美好, 但是现实很_______.

接下来我们就一起分析一下关键环节 func2string 和 string2func 如何实现的.

js存储函数方案设计

熟悉 JSON api 的朋友可能会知道 JSON.stringify 支持3个参数, 第二个参数 replacer 可以是一个函数或者一个数组。作为函数,它有两个参数,键(key)和值(value),它们都会被序列化。 函数需要返回 JSON 字符串中的 value, 如下所示:

  • 如果返回一个 Number, 转换成相应的字符串作为属性值被添加入 JSON 字符串

  • 如果返回一个 String, 该字符串作为属性值被添加入 JSON 字符串

  • 如果返回一个 Boolean, 则 "true" 或者 "false" 作为属性值被添加入 JSON 字符串

  • 如果返回任何其他对象,该对象递归地序列化成 JSON 字符串,对每个属性调用 replacer 方法。除非该对象是一个函数,这种情况将不会被序列化成 JSON 字符

  • 如果返回 undefined,该属性值不会在 JSON 字符串中输出

所以我们可以在第二个函数参数里对 value类型为函数的数据进行转换。如下:

const stringify = (obj) => {    return JSON.stringify(obj, (k, v) => {      if(typeof v === 'function') {          return `${v}`      }      return v    })}

这样我们看似就能把函数保存到后端了. 接下来我们看看如何反序列化带函数字符串的 json.

因为我们将函数转换为字符串了, 我们在反解析时就需要知道哪些字符串是需要转换成函数的, 如果不对函数做任何处理我们可能需要人肉识别.

人肉识别的缺点在于我们需要用正则把具有函数特征的字符串提取出来, 但是函数写法有很多, 我们要考虑很多情况, 也不能保证具有函数特征的字符串一定是函数.

所以我换了一种简单的方式, 可以不用写复杂正则就能将函数提取出来, 方法就是在函数序列化的时候注入标识符, 这样我们就能知道那些字符串是需要解析为函数了, 如下:

stringify: function(obj: any, space: number | string, error: (err: Error | unknown) => {}) {        try {            return JSON.stringify(obj, (k, v) => {                if(typeof v === 'function') {                    return `${this.FUNC_PREFIX}${v}`                }                return v            }, space)        } catch(err) {            error && error(err)        }}

this.FUNC_PREFIX 就是我们定义的标识符, 这样我们在用 JSON.parse 的时候就能快速解析函数了. JSON.parse 也支持第二个参数, 他的用法和 JSON.stringify 的第二个参数类似, 我们可以对它进行转换, 如下:

parse: function(jsonStr: string, error: (err: Error | unknown) => {}) {        try {            return JSON.parse(jsonStr, (key, value) => {                if(value && typeof value === 'string') {                    return value.indexOf(this.FUNC_PREFIX) > -1 ? new Function(`return ${value.replace(this.FUNC_PREFIX, '')}`)() : value                }                return value            })        } catch(err) {            error && error(err)        }    }

new Function 可以把字符串转换成 js 函数, 它只接受字符串参数,其可选参数为方法的入参,必填参数为方法体内容, 一个形象的例子:

怎么用javascript存储函数

我们上述的代码中函数体的内容:

new Function(`return ${value.replace(this.FUNC_PREFIX, '')}`)()

之所以要 return 是为了把原函数原封不动的还原, 大家也可以用 eval , 但是出于舆论还是谨慎使用.

以上方案已经能实现前端存储函数的功能了, 但是为了更工程化和健壮性还需要做很多额外的处理和优化, 这样才能让更多人开箱即用的使用你的库.

最后

为了让更多人能直接使用这个功能, 我将完整版 json 序列化方案封装成了类库,

支持功能如下:

  • stringify 在原生JSON.stringify 的基础上支持序列化函数,错误回调

  • parse 在原生JSON.parse 的基础上支持反序列化函数,错误回调

  • funcParse 将js对象中的函数一键序列化, 并保持js对象类型不变

安装方式如下:

# or npm install xijsyarn add xijs

使用:

import { parser } from 'xijs';const a = {    x: 12,    b: function() {      alert(1)    } }  const json = parser.stringify(a); const obj = parser.parse(json); // 调用方法 obj.b();

到此,相信大家对“怎么用javascript存储函数”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么用javascript存储函数

本文链接: https://www.lsjlt.com/news/300913.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么用javascript存储函数
    本篇内容主要讲解“怎么用javascript存储函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用javascript存储函数”吧!背景介绍我们都知道要想搭建一个前端页面基本需要如下3个要...
    99+
    2023-06-21
  • javascript函数怎么储存的
    Javascript函数怎么储存的Javascript函数是一组可重复使用的代码块,可以执行某个特定任务。在Javascript中,函数同样也是一种数据类型。函数可以被存储在变量中,也可以作为另一个函数的参数或返回值。在本文中,我们将探讨J...
    99+
    2023-05-14
  • javascript中数据存储的常用函数有哪些
    小编给大家分享一下javascript中数据存储的常用函数有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 数据存...
    99+
    2024-04-02
  • JavaScript本地存储怎么实现用户名存储
    这篇文章主要介绍了JavaScript本地存储怎么实现用户名存储的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript本地存储怎么实现用户名存储文章都会有所收获,下面我们一起来看看吧。一、本地存储1...
    99+
    2023-07-02
  • JavaScript中本地存储和会话存储怎么用
    小编给大家分享一下JavaScript中本地存储和会话存储怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前提知识请按照我以下的步骤来:在任意网页中按F12打...
    99+
    2023-06-29
  • Oracle中怎么创建存储过程和存储函数
    本篇文章为大家展示了Oracle中怎么创建存储过程和存储函数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。select * from emp;------...
    99+
    2024-04-02
  • 前端进阶之教你利用javascript存储函数
    目录前言背景介绍实现方案思考js存储函数方案设计最后总结前言 任何一家Saas企业都需要有自己的低代码平台.在可视化低代码的前端研发过程中, 发现了很多有意思的技术需求, 在解决这些...
    99+
    2024-04-02
  • MyBatis如何调用存储过程与存储函数
    目录1、MyBatis调用存储过程2、MyBatis调用存储函数1、MyBatis调用存储过程 MyBatis支持使用存储过程的配置。当使用存储过程时,需要设置一个参数“mode”,...
    99+
    2024-04-02
  • 浅谈MYSQL存储过程和存储函数
    目录1. 什么是存储过程和存储函数?2. 创建存储过程3. 创建存储函数4. 存储过程和存储函数的使用5. 带有if语句的存储过程6. 带有循环语句的存储过程7. 带有事务的存储过程8. 带有游标的存储函数9. 存储过程...
    99+
    2023-05-05
    MYSQL存储过程 MYSQL 存储函数
  • 了解 Go 存储函数,掌握 Laravel 中存储函数的秘诀。
    Go 存储函数是一种用于在数据库中执行特定操作并返回结果的函数。它们在处理大量数据时非常有用,可以提高性能和减少数据库负载。Laravel 是一个流行的 PHP 框架,它提供了许多便捷的方法来处理数据库操作,其中包括存储函数。本文将介绍 G...
    99+
    2023-11-08
    存储 laravel 函数
  • JavaScript如何使用localStorage存储数据
    本篇内容介绍了“JavaScript如何使用localStorage存储数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读...
    99+
    2024-04-02
  • MYSQL中存储过程和函数怎么写
    这篇文章将为大家详细讲解有关MYSQL中存储过程和函数怎么写,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是存储过程简单的说,就是一组SQL语句集,功能强大,可以实现...
    99+
    2024-04-02
  • php中怎么调用存储函数和存储过程,它的触发器是什么
    本篇内容介绍了“php中怎么调用存储函数和存储过程,它的触发器是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在php中使用存储函数或存...
    99+
    2023-06-20
  • JavaScript函数怎么用
    小编给大家分享一下JavaScript函数怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!JavaScript 函数  函数为程序设计人员提供了一个丰常方便的...
    99+
    2023-06-03
  • MySQL存储过程和函数怎么创建
    这篇文章主要介绍“MySQL存储过程和函数怎么创建”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL存储过程和函数怎么创建”文章能帮助大家解决问题。1.0  创建存储过程和函数创建存...
    99+
    2023-06-30
  • 细谈Mysql的存储过程和存储函数
    1 存储过程 1.1 什么是存储过程 存储过程是一组为了完成某项特定功能的sql语句集,其实质上就是一段存储在数据库中的代码,他可以由声明式的sql语句(如CREATE,UPDATE,SELECT等语句...
    99+
    2024-04-02
  • 关于MySQL的存储过程与存储函数
    目录初识存储过程存储过程语法存储过程调用存储函数的使用语法函数的调用对比存储函数和存储过程初识存储过程 理解:含义: 存储过程(Stored Procedure)是在大型数据库系统中...
    99+
    2023-05-19
    MySQL存储过程 MySQL存储函数
  • mysql中存储过程和存储函数指的是什么
    小编给大家分享一下mysql中存储过程和存储函数指的是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!在mysql中,存储过程和存储函数都是数据库中定义的一些SQL语句的集合。其中,存储函数...
    99+
    2024-04-02
  • mysql存储函数的使用方法
    这篇文章给大家分享的是有关mysql存储函数的使用方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。什么是存储函数:封装一段sql代码,完成一种特定的功能,返回结果。存储函数的语...
    99+
    2024-04-02
  • MySQL存储函数与存储过程的区别是什么
    这篇“MySQL存储函数与存储过程的区别是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL存储函数与存储过程的区...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作