当前位置: 首页 > article >正文

new Function 得到的都是匿名函数,怎么得到一个具名函数对象?

背景

Vue 支持动态组件编译,使用原生组件定义方式创建对象:

// 动态创建一个 Vue 组件
const MyComponent = Vue.component('componentId', {
    template: templateStr,
    data: eval(dataStr),
    methods: methodObj,
  }
);

这个 methods 怎么动态生成呢?

JS 的 new Function

方案:可以使用 new Function 创建一个函数,但是它是一个匿名函数,为了让 Vue 能够使用这些函数,必须创建对应的具名函数,怎么实现呢?

在匿名函数的方法体中,返回一个具名函数,然后再调用一次这个匿名函数。

例如,一个弹框组件,提供一个 onClose 方法,动态生成:

const closeFuncDef = 'function onClose() {\n' +
  '      this.isShow = false;\n' +
  '      this.close();\n' +
  '    },';

再定义一个 methods 对象,传入这个字符串配置创建的方法对象:

  // 定义一个匿名函数,它返回一个具名函数
  const anonymousFuncDef = new Function(`return ${closeFuncDef}`);
  // 调用这个匿名函数,得到那个具名函数对象
  const withNameFuncDef = anonymousFuncDef();
  // 设置这个函数属性的值为那个具名函数
  methods = {
     onClose: withNameFuncDef
  }

这样就能被 Vue 动态编译并使用了。

函数对象如何反序列化并解析

正向思路是 methods 函数属性都通过读取文件获取字符串后,再解析出来,那么问题来了,JSON.parse 没法解析函数对象,怎么办呢?

另外 Vue.component 方式创建组件,怎么传递自定义的样式,以及 mounted/created 挂载事件呢?能不能支持复杂组件的定义呢?

要支持定制化前端文件,还差一点。


http://www.kler.cn/a/960.html

相关文章:

  • 赤店商城系统点餐小程序多门店分销APP共享股东h5源码saas账号独立版全插件全开源
  • 【微服务】面试题 5、分布式系统理论:CAP 与 BASE 详解
  • 理解AJAX与Axios:异步编程的世界
  • 如何当前正在运行的 Elasticsearch 集群信息
  • 计算机网络 (39)TCP的运输连接管理
  • 如何在后端使用redis进行缓存,任意一种语言都可以
  • TCP UDP详解
  • 【多微电网】含多微电网租赁共享储能的配电网博弈优化调度(Matlab代码实现)
  • [ 系统安全篇 ] window 命令禁用用户及解禁方法
  • 2023 最新发布超全的 Java 面试八股文,整整 1000道面试题,太全了
  • 你是真的“C”——指针进阶知识分享【上篇】
  • Android APP隐私合规检测工具Camille使用
  • 高压放大器在压电智能传感技术的钢结构监测研究中的应用
  • 【数据结构与算法】顺序表和链表
  • MATLAB | 给热图整点花哨操作(三角,树状图,分组图)
  • 零基础搭建Tomcat集群(超详细)
  • Unity AR应用(人脸识别)手把手教程
  • [牛客算法总结]:重建二叉树
  • Snackbar
  • 【面试题】闭包是什么?this 到底指向谁?
  • 如何成为一名优秀的网络安全工程师?
  • 基于python的超市历年数据可视化分析
  • 【微信小程序】-- 页面事件 - 上拉触底 - 案例(二十七)
  • 适配器模式
  • 成都欢蓬电商:抖音集星是什么?有什么用?
  • 发光立方体效果 html+css