欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-26 17:55:33
最近有个这样的需求,要在我们的后台界面上,让平台使用者可以输入一段脚本,然后在nodejs层,读取这个脚本并执行。并且还要支持自定义输入参数的能力。研究了一下Function的使用,记录在这里。interface FunctionConstructor { /** * Creates a new function. * @param args A list of arguments the function accepts. */ new(...args:...

最近有个这样的需求,要在我们的后台界面上,让平台使用者可以输入一段脚本,然后在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);

本文地址:https://blog.csdn.net/xingchenxuanfeng/article/details/111934159