我正在尝试使用一些Office JavaScript,并尝试从API调用接收到的字符串创建可执行函数。
Excel的office JavaScript任务窗格在单击按钮时调用外部API,并以String对象的形式返回函数。为了将其转换为函数对象,我使用了:
var executable = new Function(response)
executable();
不幸的是,什么都没有发生,它似乎根本没有调用该函数。
经过一些调试,我相信它没有被调用的原因是因为响应字符串对象已经是一个完整的函数,而新的Function()
将响应 Package 在另一层函数中。
回答是:
async function highlightCells() {
await Excel.run(async (context) => {
const sheet = context.workbook.worksheets.getItem("Sheet1");
const range = sheet.getRange();
range.format.fill.color = "yellow";
await context.sync();
console.log("Called");
});
}
可执行文件解析为:
function anonymous() {
async function highlightCells() {
await Excel.run(async (context) => {
const sheet = context.workbook.worksheets.getItem("Sheet1");
const range = sheet.getRange();
range.format.fill.color = "yellow";
await context.sync();
console.log("Called");
});
}
}
你知道如何防止额外的函数 Package 器出现吗?正如你所看到的,response对象已经是一个完整的函数了。
是否需要使用其他方法将字符串转换为函数,或者是否有办法在新的Function()
语法中覆盖 Package 器?
5条答案
按热度按时间liwlm1x91#
如果事先不知道函数名,可以将函数定义括在括号中以调用它。
如果需要传递参数或等待它,让它返回函数并调用函数以获得实际函数。
dgtucam12#
如果您知道它肯定是一个函数,则可以直接在
Function
中调用它:使用
.apply(this, arguments)
,你调用那个函数,把你传递给Function
对象的参数传递给received函数,return
返回那个函数的结果。将
this
传递给apply
可以确保Function
对象可以存储在对象中,并且接收到的函数可以使用this
访问该对象。这可能不是必需的,但会使函数的行为类似于常规函数:b09cbbtk3#
只需使用
eval
而不是new Function
,您需要强制代码成为表达式,而不是语句,这就是0,
部分的作用。bwitn5fc4#
ijnw1ujt5#
由于返回的代码是完整的可执行语句,因此使用
eval()
执行它,而不是new Function()
。注意,这需要知道响应中定义的函数名,如果不知道,就需要编写代码解析它以提取函数名。