【发布时间】:2020-02-24 13:20:42
【问题描述】:
从客户端 (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 的文件夹时,它会迭代对象中的所有文件夹。
因此,为了救援,值用引号和 eval 包裹起来。
这里应该做什么?
** 已编辑 ** 我正在尝试采用函数构造函数。
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 我在没有 eval 的情况下完成了第一个。
const decideWho = myForm => {
const obj = {
key1 : func1(myForm),
key2 : func2()
};
const handleIt = () => {return obj[myForm.choice];};
console.log(handleIt());
}
【问题讨论】:
-
为什么
let i和var i在同一个表达式中?选择一个不同的变量名。 -
对不起。这不是 var i。它是 var
${i}。这样,aFolder、bFolder 等就被声明为 not i。第二个也没有太大问题,因为这个功能不经常使用。但是第一个函数对于从 eval 中拯救出来很重要,因为这是每次调用的主要函数...... -
您能否完整地展示您当前的脚本,包括
func1和func2? -
@TheMaster 我已经解决了那个问题。只是需要第二个帮助。谢谢。
-
在不同的帖子中提出不同的问题。混合问题是不受欢迎的。
标签: javascript google-apps-script eval