全局变量-用新函数构造的javascript函数不能调用其他函数

global variables - javascript Function constructed with new Function cannot call other functions

本文关键字:函数 javascript 不能 其他 调用 新函数 全局变量      更新时间:2023-09-26

在android上使用原生React。然而,我认为我的问题适用于任何javascript环境。

我正在根据服务器发送的文本构建一个函数(这是有充分理由的)。

function helper_called_from_dynamic (arg1)
{
  console.log('helper called ',arg1);
}
export class MyInvoker
{
  constructor ()
  {
    this._funcProps={};
  }
  initialize ( item )
  {
    this._funcProps["df1"]=new Function (["inArg1"],item.fnBody);
  }
  call_dynamic_func (fnName,arg1)
  { 
    return this._funcProps[fnName](arg1);
  }
}

fnBody具有以下内容:"return helper_called_from_dynamic(inArg1);"

我通过MyInvoker调用的是以下

let invInst = new MyInvoker();
let item={fnBody:"return helper_called_from_dynamic(inArg1); "};
invInst.initialize(item);
invInst.call_dynamic_func("df1","somearg");

我收到一个错误(来自react native,但我再次怀疑它在所有其他javascript环境中都很常见):

找不到变量:helper_called_from_dynamic

有可能让它发挥作用吗?这是否允许动态创建的函数调用其他函数?还是我必须求助于"eval"?

@Bergi暗示的解决方案对我有效。建议

使参数的仅评估代码调用方法

这就是我所做的,而且奏效了。我应该在发帖前考虑一下,但当时我没有想到。我没有将helper函数设置为全局函数,而是将其附加到类的一个实例,并将该实例作为参数传递给动态函数。

以下是的详细信息

export class MyHelpers
{
 helper_called_from_dynamic (arg1)
 {
   console.log('helper called ',arg1);
 }
}
export class MyInvoker
{
  constructor ()
  {
    this._funcProps={};
    this._myHelpers=new MyHelpers();
  }
  initialize ( item )
  {
    this._funcProps["df1"]=new Function (["inArg1","iHelper"],item.fnBody);
  }
  call_dynamic_func (fnName,arg1)
  { 
    return this._funcProps[fnName](arg1,this._myHelpers);
  }
}

然后,动态函数的主体现在可以访问helper_called_from_dynamic:

let invInst = new MyInvoker();
let item={fnBody:"return iHelper.helper_called_from_dynamic(inArg1); "};
invInst.initialize(item);
invInst.call_dynamic_func("df1","somearg");