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'开头,会输出错误信息
}

在这个例子中:

  1. 我们定义了一个名为 asyncCode 的字符串,它包含了异步操作的源代码。这个源代码模拟了一个延迟两秒后检查 'obsidian' 变量值是否以 'valid' 开头,并基于此决定成功(通过 resolve)或失败(通过 reject)的 Promise。

  2. 使用 new AsyncFunction('obsidian', asyncCode) 创建了一个异步函数对象 processObsidian。这里的 'obsidian' 参数会在异步函数内部作为变量名使用,接收实际调用时传入的值。

  3. 定义了变量 obsidianValue,这是将要传递给异步函数的实际参数值。

  4. 使用 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'开头,会输出错误信息
}

在这个例子中:

  1. 我们定义了一个名为 syncCode 的字符串,它包含了同步操作的源代码。这个源代码检查 'obsidian' 变量值是否以 'valid' 开头,并基于此返回成功消息或抛出错误。

  2. 使用 new Function('obsidian', syncCode) 创建了一个同步函数对象 processObsidian。这里的 'obsidian' 参数会在同步函数内部作为变量名使用,接收实际调用时传入的值。

  3. 定义了变量 obsidianValue,这是将要传递给同步函数的实际参数值。

  4. 直接调用 processObsidian(obsidianValue) 并处理其执行结果。如果 obsidianValue 符合条件(以 'valid' 开头),控制台会输出成功的消息;否则,会捕获并打印出错误信息。

同样地,使用 new Function() 构造函数时,需确保源代码来自可信来源,避免潜在的安全风险。在实际项目中,这种动态创建函数的方式可能较少见,更多情况下会直接定义和使用预编译的函数。