Javascript 动态(匿名)函数中的TypeScript调用函数

Javascript 动态(匿名)函数中的TypeScript调用函数,javascript,typescript,dynamic-function,Javascript,Typescript,Dynamic Function,我试图在TypeScript中创建一个动态函数,它调用一个已经存在的函数,如: let dynamicFunction = new Function("existingFunction(\"asdf\");"); function existingFunction(name: string) { console.log(name); } 在chrome dynamicFunction中调试时,如下所示: (function() { existingFunction("asdf");

我试图在TypeScript中创建一个动态函数,它调用一个已经存在的函数,如:

let dynamicFunction = new Function("existingFunction(\"asdf\");");

function existingFunction(name: string) {
    console.log(name);
}
在chrome dynamicFunction中调试时,如下所示:

(function() {
existingFunction("asdf");
})
import * as parser from "./parser";

let vars = {};

// This is a simulation of your funciton. It just plucks values from `vars`.
function existingFunction(name: string) {
    return vars[name];
}

function resetVars() {
   vars = {
    "VALUE": 1,
    "FOO": 2,
    "BAR": 3,
   };
}

function test(gen) {
    const fn1 = gen.makeFunction("VALUE==1");
    console.log(fn1(), "should be true");

    const fn2 = gen.makeFunction("BAR==3");
    console.log(fn2(), "should be true");

    vars["BAR"] = 7;
    // Call the same function again, but with a new value in `vars`.
    console.log(fn2(), "should be false");

    const fn3 = gen.makeFunction("BAR==1000");
    console.log(fn3(), "should be false");
}

resetVars();
const gen = new parser.FunctionGenerator(existingFunction);
test(gen);
当我尝试执行dynamicFunction时,它会说“uncaughtreferenceerror:existingFunction未定义”,这并不奇怪,因为它是一个不同的作用域,但我如何在dynamicFunction内部调用existingFunction呢

任何帮助都将不胜感激

编辑:

更准确地说:我有一个typescript文件,其中包含一个模块。 此模块导出一个函数,该函数应返回创建的动态函数。 创建的dynamicFunction随后用于另一个模块,该模块实际上包含exisitingFunction

我选择这种方法是因为我需要将给定的字符串转换为可执行条件,该条件将被执行多次

例如:将字符串“VALUE==1”转换为:

下面是一个简单的示例,说明它的外观:

parser.ts:

export module Parser {
   export function getFunction(expression: string) {
      // Calculating condition...
      let condition = "existingFunction(\"VALUE\") == 1;"
      return new Function(condition);
   }
}
条件1.ts:

import { Parser } from "./parser";
class Condition {
    // getting the DynamicFunction
    private _dynamicFunction = Parser.getFunction("VALUE==1");

    someFunctionInsideCondition() {
       // Calling the DynamicFunction
       this._dynamicFunction();
    }
}

// Maybe this function should be somewhere else?
function existingFunction(name: string) {
    console.log(name);

    return 1;
}
我希望这能更好地解释我的问题。

来自

使用函数构造函数创建的函数不会为其创建上下文创建闭包;它们始终在全局范围内创建。运行它们时,它们将只能访问自己的局部变量和全局变量,而不能访问调用函数构造函数的作用域中的变量。这不同于将eval与函数表达式的代码一起使用

因此,您必须将
existingFunction
作为参数传递或在全局空间中定义它

试一试

var existingFunction = function(name: string) {
    console.log(name);
}
还可以查看哪些将使您能够访问当前范围

---更新

在问题更新之后,考虑您关于出于安全考虑不想使用eval的评论(我完全同意)

问题在于,在生成函数的作用域中,
未定义的
。将您的
现有函数
作为全局范围的一部分已经是一个坏主意,而且在Typescript和模块架构之间似乎根本不可能

那么为什么不向生成的函数传递上下文呢

这将允许您控制应用程序向生成的函数公开多少内容,同时允许它访问外部方法

大致如下:

类解析器{
静态getFunction(表达式){
让条件=新函数(“上下文”,“context.existingFunction(\“VALUE\”)==1;”;
返回条件;
}
}
阶级条件{
构造函数(){
这是._dynamicFunction=Parser.getFunction(“VALUE==1”);
}
someFunctionInsideCondition(){
//调用DynamicFunction
本._动态功能(本);
}
existingFunction(名称){
console.log(“hello”+name);
返回1;
};
}
设c=新条件();

c、 someFunctionInsideCondition()
我将跳过
新函数的使用,而是按如下方式操作

parser.ts
文件将包含以下内容:

export class FunctionGenerator {
    constructor(private fn: Function) {}

    makeFunction(args: string): Function {
        const [variable, val] = args.split("==");
        return () => this.fn(variable) == val;
    }
}
这基本上是一个工厂,它允许创建一系列函数,这些函数在创建工厂时调用传递的函数。然后,您可以使用
makeFunction
进行要执行的特定检查。(请注意,我在你的问题中使用了
==
。我更喜欢使用
===
,除非有反对它的理由。)

然后可以这样使用它:

(function() {
existingFunction("asdf");
})
import * as parser from "./parser";

let vars = {};

// This is a simulation of your funciton. It just plucks values from `vars`.
function existingFunction(name: string) {
    return vars[name];
}

function resetVars() {
   vars = {
    "VALUE": 1,
    "FOO": 2,
    "BAR": 3,
   };
}

function test(gen) {
    const fn1 = gen.makeFunction("VALUE==1");
    console.log(fn1(), "should be true");

    const fn2 = gen.makeFunction("BAR==3");
    console.log(fn2(), "should be true");

    vars["BAR"] = 7;
    // Call the same function again, but with a new value in `vars`.
    console.log(fn2(), "should be false");

    const fn3 = gen.makeFunction("BAR==1000");
    console.log(fn3(), "should be false");
}

resetVars();
const gen = new parser.FunctionGenerator(existingFunction);
test(gen);

我不太明白你到底想做什么,但是,也许
让dynamicFunction=existingFunction(“asdf”)是您想要的。谢谢。这解释了为什么我不能访问“existingFunction”,但这并不能真正解决我的问题。也许看看我的编辑。我更准确地解释了我的问题。我想可能是因为模块。今晚晚些时候我去看看。一般来说,我认为您可能会更幸运地只返回一个字符串,然后使用eval来执行它是的,使用格式化字符串的eval可以工作,但由于我处理的是敏感数据,我宁愿不使用eval。非常感谢!我只是在自己的项目中尝试过,现在一切都很好。如果语句总是那么简单的话,那就行了。问题是,这些语句与&&或| |以及大括号和其他函数(例如getCurrentDate、乘法/除法、加法/减法)结合使用可能会变得非常复杂,但无论如何,谢谢!