如何在Javascript中向基于eval的函数传递参数

13

我将函数体与函数名称一起存储在字符串中。

function fnRandom(lim){
    var data=[];
    for(var i=0;i<lim;i++)
    {
        data=data.concat(Math.floor((Math.random() * 100) + 1));
    }
return data;
}
在从下拉列表中选择函数名称后,我使用 eval 来执行函数体。
JSON.stringify(eval(this.selectedFunction.body));

我想将'lim'传递到这个执行中,或者我能以某种方式使用 functionName 作为执行的起点吗?


2
请使用 Function 构造函数。 - gurvinder372
Function(this.selectedFunction.body) 给出了一个名为 anonymous(){} 的函数,实际上的问题是如何将数据传递给这个函数。 - Saket Nalegaonkar
this.selectedFunction 是否包含有关参数的任何信息?如果没有,这将是困难的,因为无法知道主体中未声明的变量是参数还是全局变量。 - Barmar
实际上它确实需要验证参数;也许我应该发送一个Json对象并在其上进行处理。 - Saket Nalegaonkar
如何像NODE-RED的函数节点一样实现它?有人有想法吗? - Saket Nalegaonkar
4个回答

21
使用 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() 调用中没有指定任何参数。 - Barmar
只有在函数使用arguments而不是命名参数时才有效。 - Barmar
@Barmar 是的,我也添加了一个带有命名参数的版本。 - gurvinder372
你的函数体是整个函数,而不仅仅是函数体。 - Barmar
如果函数在 OP 的情况下只有主体,则无法使用命名参数,因为我们不知道主体中使用的参数名称。 - gurvinder372
1
我知道,我在上面的评论中写过了。我认为他有一个设计问题,这使得无法以一般方式解决。 - Barmar

8

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"

使用Function的另一种方法:

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

他只有函数体,没有整个函数。 - Barmar
如果参数不是命名为“lim”呢? - Barmar
1
他必须知道在他的body-strings中参数应该如何命名。否则,@gurvinder372的答案会更适合。 - Gerry
1
是的,我认为他由于这个原因存在一些基本的设计问题。像这样的解决方案不能与任意函数一起使用。他真的需要在 this.selectedFunction 中存储比仅函数体更多的信息。 - Barmar
我完全同意你的观点。 - Gerry

4
你可以使用 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);


0

我正在使用vuejs,所以代码会像这样

getTargetfunction(funcN, o_id, i_id) {
            console.log(funcN, o_id, i_id);
            const x = o_id;
            const y = i_id;
            eval("this." + funcN + "(x,y)");
        },

developer mozilla eval()

间接的 eval 在全局范围内工作,而不是局部范围内,并且正在评估的代码无法访问它被调用的作用域中的局部变量。

  function test() {
  const x = 2;
  const y = 4;
  // Direct call, uses local scope
  console.log(eval("x + y")); // Result is 6
  console.log(eval?.("x + y")); // Uses global scope, throws because x is undefined
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接