Javascript 意外标记';出口';

Javascript 意外标记';出口';,javascript,Javascript,我正在尝试将变量从index.js导出到profile.js。当我在文件顶部导出时,例如 export let k = 12; 或 它很好用。但是,当我在DOMContentLoaded事件之后导出时,例如 document.addEventListener('DOMContentLoaded', function(){ export let k = 12; }) 然后显示意外的标记“导出”。下面的一个警告也给出了相同的错误 if (true){ export let k = 2; } 我

我正在尝试将变量从index.js导出到profile.js。当我在文件顶部导出时,例如

export let k = 12;

它很好用。但是,当我在DOMContentLoaded事件之后导出时,例如

document.addEventListener('DOMContentLoaded', function(){ export let k = 12; })
然后显示意外的标记“导出”。下面的一个警告也给出了相同的错误

if (true){ export let k = 2; }
我做错了什么

加载DOMContentLoaded后,我应该如何导出变量

你不能<代码>导出和导入只能出现在模块的顶层

您可以改为导出变量,并在处理程序中设置其值:

export let k;
document.addEventListener('DOMContentLoaded', function(){ k = 12; })
如果其他模块导入
k
,它们将获得一个只读绑定,这意味着如果它们在
DOMContentLoaded
之前使用它,它们将获得您提供的任何初始值(
上面未定义的
,因为
let k;
声明中没有初始值设定项),但是如果他们在
DOMContentLoaded
之后使用它,他们将看到处理程序分配的值

这样说,如果您的模块提供了在某个点之后才可用的信息,您可能会考虑导出一个承诺,比如:

let kPromiseResolve;
export const kPromise = new Promise(resolve => {
    kPromiseResolve = resolve;
});
document.addEventListener('DOMContentLoaded', function(){ kPromiseResolve(12); })
然后,使用它的模块将执行以下操作:

import { kPromise } from "./your-module.js";
kPromise
.then(k => {
    //  ...use `k`...
})
.catch(error => {
    // ...
});
或者在支持的环境中,如果导入模块在没有
k
的情况下无法执行任何有用的操作,则可以执行以下操作:

import { kPromise } from "./your-module.js";
const k = await kPromise;
// ...use `k`...

令牌导出不能在函数内您不能在函数内使用
export
,因为导出是在其他模块导入模块后立即进行的。你为什么要这么做?这能回答你的问题吗?(哦,在上面的第一个代码块中,如果您看到
let k=12;
,请点击刷新。我忘记删除
let
import { kPromise } from "./your-module.js";
const k = await kPromise;
// ...use `k`...