【问题标题】:Evaling async function definitions评估异步函数定义
【发布时间】:2021-12-19 23:41:12
【问题描述】:

我正在开发一个用于 Javascript 的 IDE,它允许 开发人员评估他们的代码。 在现代 Chrome 控制台中,我可以运行:

eval(`try{function foo3(){console.log("Hi")}} catch(err){console.log(err)}`)

和 foo3 将被定义并正常调用。 我也可以跑:

eval(`async function foo4(){console.log("Hi")}`)

和 foo4 将被定义并正常调用。 但是当我运行时:

eval(`try{async function foo5(){console.log("Hi")}} catch(err) {console.log(err)}`)

我没有收到任何错误,但 foo5 未定义。 请注意,示例 1 和 示例 3 只是“功能”之前的“异步”。 我希望 foo5 被定义。 非常感谢线索。

【问题讨论】:

  • {} 中的函数声明由于 Web 兼容性原因而表现异常,通常最好避免。 This 好像也有关系
  • try/catch 的意义何在?你永远不会仅仅从定义一个函数中得到一个异常。
  • 感谢 Nick,它有助于实现 jS 的这个灰色地带。
  • Bergi,程序员可能为函数输入了错误的语法,所以外部的 try/catch 可以帮助捕捉到它。
  • @user1343035 不,它没有。如果语法无效,则不会运行整个语句。您需要将 try 块放在 eval() 调用周围以捕获语法错误。

标签: javascript function asynchronous eval definition


【解决方案1】:

好吧,您可以稍微反转您的代码,将try/catch 块包含在您的async 函数中以使其运行。

eval(`async function foo5() {try {console.log("Hi")} catch (err) { console.log(err)}}`);

foo5();

【讨论】:

  • 根据 OP 提供的信息,我假设他们正在编码的 IDE 中的“评估器”是这样的:eval(`try{ ${CUSTOM_CODE_HERE} } catch(err){console.log(err)}`),因此将目标函数移到 try 之外可能不会行不通(这就是我的理解)。
  • 好吧,eval 只是执行字符串,就好像它是一段实际的 javascript 代码一样。所以反转代码,我觉得应该可以正常工作。
  • NullDev,是的,您对我的实际用例做了更好的描述,谢谢。萨尔维诺 我怀疑你是对的。您的回答是对问题的一个非常聪明的“重构”。虽然不是很理想,但只要稍加努力,就可以很好地解决我的问题。
  • 是的,如果您觉得这个答案有用,请接受并点赞。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 2021-06-30
  • 2014-01-01
  • 2015-03-30
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多