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

最近有个这样的需求,要在我们的后台界面上,让平台使用者可以输入一段脚本,然后在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);
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值