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
相关产品推荐
相关产品推荐

