You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中非async函数调用报未定义,async是否影响函数全局注册时机?

问题原因分析
  • async关键字本身不会对函数在全局作用域的注册时机产生任何影响,异步函数和普通函数的函数声明提升规则完全一致。
  • 你遇到的报错本质是语法错误导致整个script块解析终止,和函数注册时机无关:

    当你移除async关键字后,函数内部保留的await关键字就成为了非法语法:await仅允许在async函数、ES模块顶层作用域中使用,在普通函数内部使用会直接抛出语法错误。

  • 浏览器解析<head>里的script标签时,如果遇到未捕获的语法错误,会直接终止整个当前script块的解析流程,这个script块内定义的所有函数、变量都不会被注册到全局作用域,因此你在body中调用时就会抛出ReferenceError: getData is not defined。
复现验证方法

你可以打开浏览器控制台查看报错,移除async后首先会抛出如下语法错误,早于函数注册的流程:

Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules

如果你同步修改函数代码,移除所有await关键字改为同步实现,普通函数也可以正常被识别调用,不会出现未定义报错。

额外注意事项
  • 你当前调用异步函数的写法const data = getData()拿到的是Promise对象,不是实际返回的{x,y}数据,需要配合await或者.then()才能拿到真实返回值。
  • 你代码中用到的split、columns变量没有声明关键字,会默认成为全局变量,可能引发变量污染问题,建议补充const/let声明。

内容的提问来源于stack exchange,提问作者Rahul Deora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:15:03