【问题标题】:How to pass parameters to an eval based function inJavascript如何在Javascript中将参数传递给基于eval的函数
【发布时间】:2018-08-13 23:16:49
【问题描述】:

我将函数体存储在带有函数名的字符串中。

function fnRandom(lim){
    var data=[];
    for(var i=0;i<lim;i++)
    {
        data=data.concat(Math.floor((Math.random() * 100) + 1));
    }
return data;
}

从下拉列表中选择 functionName 后,我使用 eval 来执行函数体。

JSON.stringify(eval(this.selectedFunction.body));

我想将 'lim' 传递给此执行,或者我可以使用 functionName 作为启动点以某种方式执行吗?

【问题讨论】:

  • 改用Function构造函数。
  • Function(this.selectedFunction.body) 在实际函数周围给出函数匿名(){},我的问题与将数据传递给此函数有关
  • this.selectedFunction 是否包含有关参数的任何信息?如果不是,这将很困难,因为无法知道主体中哪些未声明的变量是参数还是全局变量。
  • 其实确实需要验证参数;也许我应该发送一个 Json 对象并对此进行处理
  • 如何按照 NODE-RED 的功能节点的方式进行操作。有人知道吗?

标签: javascript parameter-passing eval


【解决方案1】:

您可以使用 Function 对象。

var param1 = 666;
var param2 = 'ABC';
var dynamicJS = 'return `Param1 = ${param1}, Param2 = ${param2}`';
var func = new Function('param1', 'param2', dynamicJS);
var result = func(param1, param2);
console.log(result);

【讨论】:

    【解决方案2】:

    Eval 计算你给它的任何东西,甚至返回一个函数。

    var x = eval('(y)=>y+1');
    x(3) // return 4
    

    所以你可以这样使用它:

    var lim = 3;
    var body = 'return lim+1;';
    JSON.stringify(eval('(lim) => {' + body + '}')(lim)); //returns "4"
    

    函数的另一种使用方式:

    var lim = 3;
    JSON.stringify((new Function('lim', this.selectedFunction.body))(lim));
    

    【讨论】:

    • 他只有函数体,没有整个函数。
    • 如果参数不是lim怎么办?
    • 他必须知道他的参数必须如何在他的身体字符串中命名。否则@gurvinder372 的答案会更适合。
    • 是的,我认为他因此存在一些基本的设计问题。像这样的解决方案不适用于任意函数。他确实需要在this.selectedFunction 中存储更多信息,而不仅仅是正文。
    • 我完全同意你的看法
    【解决方案3】:

    使用Function构造函数

    var body = "console.log(arguments)"
    
    var func = new Function( body );
    func.call( null, 1, 2 ); //invoke the function using arguments

    带有命名参数

    var body = "function( a, b ){ console.log(a, b) }"
    var wrap = s => "{ return " + body + " };" //return the block having function expression
    var func = new Function( wrap(body) );
    func.call( null ).call( null, 1, 2  ); //invoke the function using arguments

    【讨论】:

    • 您没有在new Function() 调用中指定任何参数。
    • 这只有在函数使用arguments而不是命名参数时才有效。
    • @Barmar 是的,我也添加了一个带有命名参数的版本。
    • 你的函数体是整个函数,而不仅仅是函数体。
    • 我知道,我在上面的评论中写道。我认为他有一个设计问题,无法以一般方式解决。
    猜你喜欢
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多