js动态执行代码片段
参考:runCode
以下是一个使用 new AsyncFunction() 创建并执行异步函数的具体例子:
// 假设我们有一个异步操作的源代码字符串
const asyncCode = `
return new Promise((resolve, reject) => {
setTimeout(() => {
if (obsidian.startsWith('valid')) {
resolve('Obsidian value processed successfully.');
} else {
reject(new Error('Invalid Obsidian value.'));
}
}, 2000);
});
`;
// 创建一个异步函数对象
const processObsidian = new AsyncFunction('obsidian', asyncCode);
// 准备要传递给异步函数的实际参数
const obsidianValue = 'validInput';
// 调用并等待异步函数执行的结果
try {
const result = await processObsidian(obsidianValue);
console.log(result); // 输出: Obsidian value processed successfully.
} catch (error) {
console.error(error.message); // 如果obsidianValue不是'valid'开头,会输出错误信息
}
在这个例子中:
我们定义了一个名为 asyncCode 的字符串,它包含了异步操作的源代码。这个源代码模拟了一个延迟两秒后检查 'obsidian' 变量值是否以 'valid' 开头,并基于此决定成功(通过 resolve)或失败(通过 reject)的 Promise。
使用 new AsyncFunction('obsidian', asyncCode) 创建了一个异步函数对象 processObsidian。这里的 'obsidian' 参数会在异步函数内部作为变量名使用,接收实际调用时传入的值。
定义了变量 obsidianValue,这是将要传递给异步函数的实际参数值。
使用 await 关键字调用 processObsidian(obsidianValue) 并等待其执行结果。如果 obsidianValue 符合条件(以 'valid' 开头),控制台会输出成功的消息;否则,会捕获并打印出错误信息。
请注意,实际应用中,动态创建函数的源代码通常是从某个可靠来源获取,如模板引擎生成、用户输入经过严格验证等。直接拼接或接受不可信源的源代码可能会引入安全风险,如代码注入攻击。因此,在使用 new AsyncFunction() 时务必确保代码安全。
如果您需要使用 new Function()(或其同步版本)来执行同步代码,您可以参照以下示例:
// 假设我们有一个同步操作的源代码字符串
const syncCode = `
if (obsidian.startsWith('valid')) {
return 'Obsidian value processed successfully.';
} else {
throw new Error('Invalid Obsidian value.');
}
`;
// 创建一个同步函数对象
const processObsidian = new Function('obsidian', syncCode);
// 准备要传递给同步函数的实际参数
const obsidianValue = 'validInput';
// 调用并处理同步函数执行的结果
try {
const result = processObsidian(obsidianValue);
console.log(result); // 输出: Obsidian value processed successfully.
} catch (error) {
console.error(error.message); // 如果obsidianValue不是'valid'开头,会输出错误信息
}
在这个例子中:
我们定义了一个名为 syncCode 的字符串,它包含了同步操作的源代码。这个源代码检查 'obsidian' 变量值是否以 'valid' 开头,并基于此返回成功消息或抛出错误。
使用 new Function('obsidian', syncCode) 创建了一个同步函数对象 processObsidian。这里的 'obsidian' 参数会在同步函数内部作为变量名使用,接收实际调用时传入的值。
定义了变量 obsidianValue,这是将要传递给同步函数的实际参数值。
直接调用 processObsidian(obsidianValue) 并处理其执行结果。如果 obsidianValue 符合条件(以 'valid' 开头),控制台会输出成功的消息;否则,会捕获并打印出错误信息。
同样地,使用 new Function() 构造函数时,需确保源代码来自可信来源,避免潜在的安全风险。在实际项目中,这种动态创建函数的方式可能较少见,更多情况下会直接定义和使用预编译的函数。