封装Http类实例化时报Cannot access 'API_URL' before initialization错误如何解决?
问题原因
- 变量名冲突+const暂时性死区:如果存放Http实例的文件顶部同时导入了
./api里的API_URL,又在当前文件声明了同名的const API_URL常量,由于const存在暂时性死区,当前作用域的const声明语句执行前,所有对API_URL的访问都会抛出初始化前无法访问的错误,即使你导入了同名的全局变量也会被当前作用域的声明覆盖。 - 冗余导入:Http类已经支持通过构造函数传入自定义apiUrl,但是类文件顶部依然导入了全局的
API_URL,这个导入完全无用,后续如果改代码不小心在Http类内部直接用了导入的API_URL而非构造函数传入的参数,也会引发依赖问题。 - 循环依赖:如果你的
./api导出API_URL的文件,又导入了Http类或者Http实例所在的文件,会导致模块加载顺序异常,API_URL还没完成导出就被其他模块访问,也会抛出该错误。
修复方案
- 先移除Http类文件中无用的全局API_URL导入,直接删掉
import { API_URL } from './api';这行,避免后续误引用。 - 实例化Http的文件中,要么重命名你自定义的API_URL常量避免和导入的变量重名,要么移除不需要的
import { API_URL } from './api'导入语句,修改后的实例化代码参考:
const CUSTOM_API_URL_1 = 'http://127.0.0.1:8081' export const http1 = new Http(CUSTOM_API_URL_1); const CUSTOM_API_URL_2 = 'http://127.0.0.1:8082' export const http2 = new Http(CUSTOM_API_URL_2);
- 检查是否存在循环依赖,确保
./api导出API_URL的文件,没有导入Http类或者Http实例所在的文件,如果存在循环引用,把公共配置抽离到独立的常量文件,避免互相导入。
内容的提问来源于stack exchange,提问作者Nemus
相关产品推荐
相关产品推荐

