Javascript 动态(匿名)函数中的TypeScript调用函数
我试图在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");
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、乘法/除法、加法/减法)结合使用可能会变得非常复杂,但无论如何,谢谢!