您现在的位置是:首页 > 正文

JS 脚本动态执行 动态生成Function / 三个点运算符(扩展运算符)

2024-01-30 21:43:03阅读 0

最近有个这样的需求,要在我们的后台界面上,让平台使用者可以输入一段脚本,然后在nodejs层,读取这个脚本并执行。并且还要支持自定义输入参数的能力。
研究了一下Function的使用,记录在这里。

interface FunctionConstructor {
    /**
     * Creates a new function.
     * @param args A list of arguments the function accepts.
     */
    new(...args: string[]): Function;
    (...args: string[]): Function;
    readonly prototype: Function;
}

使用new Function(functionScript)可以根据一个脚本字符串生成一个动态的函数。
然后执行这个函数即可得到函数的结果。

例如:

        let functionScript = "return 1+2"
        let f = new Function(functionScript)();
        let result = f();

result执行结果为3。 非常的简单。

复杂一点的也行,比如:

        let functionScript =
            "if (1 > 2) {\n" +
            "    return 1;\n" +
            "} else {\n" +
            "    return 2;\n" +
            "}"
        let f = new Function(functionScript);
        let result = f();

运行结果是2。

上面的都是不带参数的,带参数的也可以,比如下面这个函数:

function findMax(data1, data2) {
    if (data1 > data2) {
        return data1;
    } else {
        return data2;
    }
}

它带有两个参数,data1和data2,这就需要传到Function里面。

        let functionScript =
            "if (data1 > data2) {\n" +
            "    return data1;\n" +
            "} else {\n" +
            "    return data2;\n" +
            "}"
        let f = new Function("data1","data2",functionScript);
        let result = f(1,2);

以上,就完成了脚本动态执行的功能。


另外,扩展运算符( spread )...args 在生成Function中经常使用。
扩展运算符能将一个数组转为用逗号分隔的参数序列。

        console.log(...[1, 2, 3])
        console.log(1, 2, 3)

上面这两行代码就是完全等价的。

Function 的构造函数 new(...args: string[]): Function; 的args参数,是需要展开的,不是一个数组。但是实际开发中,参数肯定是要用数组来保存的。这里就需要用扩展运算符来展开。

上面的代码,就可以转行成下面的形式。

        let argsKey = ["data1", "data2"];
        let argsValue = [1, 2];

        let functionScript =
            "if (data1 > data2) {\n" +
            "    return data1;\n" +
            "} else {\n" +
            "    return data2;\n" +
            "}"
        let f = new Function(...argsKey, functionScript);
        let result = f(...argsValue);

网站文章

  • Python常见面试题总结——个人Python学习经验

    Python常见面试题总结——个人Python学习经验

    这里对Python常见面试题做一个总结,也仅仅是个人的经验,不足之处,还请伙伴们补充!python是如何进行类型转换的?python提供了将变量或值从一种类型转换成另一种类型的内置函数。比如int函数...

    2024-01-30 21:42:56
  • 前端开发工具vscode

    前端开发工具vscode

    开发工具

    2024-01-30 21:42:48
  • K8S Controller技术详解

    K8S Controller技术详解

    1.什么是Controller Controller是在集群上管理和运行容器的对象,Controller是实际存在的,Pod是虚拟的 2.Pod和Controller的关系 Pod是通过Control...

    2024-01-30 21:42:41
  • SpringAop(自定义注解)实现用户操作日志记录

    SpringAop(自定义注解)实现用户操作日志记录

    1.简介 在使用spring完成项目的时候需要完成记录日志,开始以为Spring 的AOP功能,就可以轻松解决,半个小时都不用,可是经过一番了解过后,发现一般的日志记录,只能记录一些简单的操作,例如表...

    2024-01-30 21:42:14
  • XCTF-攻防世界CTF平台-Web类——8、NaNNaNNaNNaN-Batman(JS代码加密)

    XCTF-攻防世界CTF平台-Web类——8、NaNNaNNaNNaN-Batman(JS代码加密)

    目录标题方法一、通过输入得到flag方法二:直接计算得到flag下载附件,查看:是一段乱码的JS代码我们把文件后缀改成.html文件,在浏览器运行看一下代码效果:一个输入框和“OK”按钮,输入“11”...

    2024-01-30 21:42:07
  • 【机器学习】准确率、精确率、召回率、误报率、漏报率概念及公式

    阳性(正)样例P和阴性(负)样例N,将正样本预测为正样本的为True positive(TP),正样本预测为负样本的为False negativ(FN),负样本预测为正样本的为False positi...

    2024-01-30 21:41:59
  • php5.6 curlpost图片,PHP 5.6 的Curl POST

    1、一般的http post 支持提交键值对和二进制数据,win 下使用php 5.6的curl可以这样模拟如下代码:$ch = curl_init();//curl_setopt($ch, CURL...

    2024-01-30 21:41:33
  • D 动态序列

    题目链接:2021年广东工业大学第十五届文远知行杯程序设计竞赛(同步赛)D题目大意n个数q次询问,每次询问分五种,op=1表示序列中所有数乘k,op=2表示序列中所有数加上k,op=3表示序列头部增加...

    2024-01-30 21:41:25
  • OpenGL | 设置视口glViewport &裁剪glScissor & 屏幕截图 glReadPixel

    opengl 设置多个视口 & 屏幕截图

    2024-01-30 21:41:18
  • 服务器厂家文档,服务器厂家

    服务器厂家文档,服务器厂家

    服务器厂家 内容精选换一换已在物联网平台注册的设备,若设备的唯一标识码发生变更(如更换设备等场景),第三方应用需要调用此接口在物联网平台更新设备的唯一标识,并重新绑定设备。仅当设备处于离线状态时,才能...

    2024-01-30 21:41:12