gpt4 book ai didi

javascript - 使用对象选择要运行的函数(动态)

转载 作者:行者123 更新时间:2023-12-02 21:40:30 25 4
gpt4 key购买 nike

从客户端(html)发送表单,服务器端通过选择选项之一决定运行哪个函数。

const decideWho = (form) => {
const choice = form.choice;
const obj = { key1 : 'func1(form.input1)',
key2 : 'func2(form.input2)'......};
return eval(obj[choice]||obj[default]);
}

由于其他一些问题,放置了这段代码,Josh Wulf提到了使用 eval 的危险。

所以我来了。我无法搜索与我的情况相关的信息,因此如果您知道任何已解答的问题,请告诉我。

我的问题是,一开始我只是将 obj 的值放在不带引号的位置。然后灾难就发生了。当最后一行 obj[choice]||obj[default] 被调用时,obj 中的所有函数都会被调用,并且某些函数会重复迭代。我不知道出了什么问题。

不仅如此。

const someFunc = () => {
const a = {
sourceFolder: "",
aFolder: "1OoK3j",
bFolder: "1M_cyv",
cFolder: "11maBJ",
dFolder: "1QxA8P",
eFolder: "11lG"};
for (let i in a)
eval(`var ${i} = getFolder(a['${i}']);`);

..move files to the destination above.
}


const getFolder = id => {
try {
if (id) {
return DriveApp.getFolderById(id);
} else return DriveApp.getRootFolder();
} catch (e) {
// If the folder by the id doesn't exists, return root folder.
return DriveApp.getRootFolder();
}
}

我不想使用相同的函数声明每个文件夹。所以我把它们放在 obj 中,并且没有 eval,进行迭代。

for (let i in a) var i = getFolder(a[i]);

灾难又来了。当我调用 aFolder 并期望它返回具有提到的 id 的文件夹时,它会迭代对象中的所有文件夹。

因此,为了救援,值用引号括起来并暂时评估。

这里应该做什么?

** 已编辑 **我正在尝试采用函数构造函数。

const aa = form => `id: ${form.id}`;
const bb = () => "I'm b";
const aaa = form => {
const obj = {
key1 : 'aa(form)',
key2 : 'bb'
};
const handleIt = new Function('return ' + obj[form.choice])();
console.log(handleIt());
}
const cc = () => {
let form = {id: 'student 1', choice: 'key1'};
aaa(form);
form = {id: 'student 2', choice: 'key2'};
aaa(form);
}

这些只是为了提出问题而简化的,但真正的函数很长。当我表演时

form = {id: 'student 2', choice: 'key2'};
aaa(form);

它按预期工作。但是当一个参数应该被传递时,它会说表单未定义。

let form = {id: 'student 1', choice: 'key1'};
aaa(form);

如果函数构造函数是解决方案,我需要在哪里以及如何添加参数?

const aaa = form => {
const obj = {
key1 : 'aa(form)',
key2 : 'bb'
};
const handleIt = new Function('return ' + obj[form.choice])();
console.log(handleIt());
}

编辑 2 我在没有评估的情况下完成了第一个。

const decideWho = myForm => {
const obj = {
key1 : func1(myForm),
key2 : func2()
};
const handleIt = () => {return obj[myForm.choice];};
console.log(handleIt());
}

最佳答案

嗯,您不应该使用 eval 并不意味着您不能使用 new Function 来代替。其实这个question关于两者之间的差异进行了非常好的讨论

所以..也许你应该转换你的代码

const decideWho = (form) => {
const choice = form.choice;
const obj = {
key1 : 'func1(form.input1)',
key2 : 'func2(form.input2)'
};
return eval(obj[choice]||obj[default]);
}

类似于:

const decideWho = (form) => {
const choice = form.choice;
const obj = {
key1 : 'return true',
key2 : 'return 7'
};
return new Function(obj[choice]||obj[default]);
}

然后只需调用您的处理程序:

 const funcHandler = decideWho(myForm)
funcHandler()

如果你也想传递参数,请引用这个MDN样本

关于javascript - 使用对象选择要运行的函数(动态),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60376831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com