【发布时间】:2026-02-26 07:15:02
【问题描述】:
我正在尝试为我的课堂创建仪表板(异步开始、异步持续时间、异步测试)...
我的问题是我使用eval 动态创建函数(我知道这是通向黑暗面的方法)。那些动态创建的函数是否也不再存在于创建它们的 for 循环中?
function onOpen() {
const FUNC_STR = 'course';
var evalString = '';
const response = Classroom.Courses.list();
const courses = response.courses;
for(var index in courses) {
const course = courses[index]
evalString += 'function ' + FUNC_STR + course.id + '() { ' + FUNC_STR + '(' + course.id + ') }';
eval(evalString);
}
const ui = SpreadsheetApp.getUi();
var mymenu = ui.createMenu('Classroom');
if (courses && courses.length > 0) {
for (i = 0; i < courses.length; i++) {
const course = courses[i];
mymenu.addItem(course.name, FUNC_STR + course.id);
}
mymenu.addToUi();
}
}
function course(id ) {
SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Classroom.Courses.get(id).name);
}
【问题讨论】:
-
请放心,这不是通向黑暗面的方法 - 它是黑暗面:糟糕的语言标记被拼接成一个弗兰肯斯坦怪物,被评估为生命,活着一点点将控制权传递给他们的黑暗生成并在下一次迭代之前死亡并成为要收集的垃圾。起码用
Function构造函数……但是为什么要在2020年创建这样的函数,有什么理由这样做吗? -
开玩笑的,只是don't use eval。由于函数是 JS 中的一等公民,如果你评估一个表示函数声明的字符串,你会得到一个
Function对象。但除非它是从循环外部引用的,否则它最终会被垃圾回收。 -
虽然我不确定我是否能正确理解你的目标,但根据我对你目标的猜测,我提出了一个修改后的脚本,没有使用
eval作为答案。你能确认一下吗?如果我误解了您的问题并且这不是您期望的方向,我深表歉意。