javascript 用new Function构造的函数不能调用其他函数

标签 javascript global-variables ecmascript-6

在 Android 上使用 React-native。但是,我认为我的问题适用于任何 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 具有以下内容: “返回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 环境来说都是常见的):

cannot find variable: helper_called_from_dynamic

有可能让它发挥作用吗?那是允许动态创建的函数调用其他函数吗? 或者我必须求助于“eval”?

最佳答案

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

Make the evaled code only call methods of arguments

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

详细内容如下

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_used_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");

关于javascript 用new Function构造的函数不能调用其他函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38426601/

相关文章:

javascript - 奇怪的 ES6 Array.every 行为

c++ - 将 C++ 实例方法分配给全局函数指针?

Python:无法从 init 文件导入在 setUp 方法中初始化的全局变量

javascript - 提高自动输入 javascript 代码的输入速度

JavaScript 数组原型(prototype)

syntax - Pandoc,Markdown to Doc,如何使用变量?

javascript - typescript 和嵌套解构

javascript - ES6 用箭头函数给变量赋值

javascript - 使用 Canvas 查找图像的主要/主色

javascript - jQuery 添加缓动会破坏后面的动画。语法错误?