以下回答由Deepseek AI 生成,内容仅供参考,请仔细甄别。
本文总结了 ES6 export 语句的各种语法限制,帮助在编写模块时避免常见的语法错误。
时间有限,重点看实际开发建议即可。
ES6 export 语句 语法规范
export 语句类型与语法限制
| 导出形式 | 语法示例 | 分号要求 | 允许声明/赋值 | 允许表达式 | 特殊限制 |
|---|---|---|---|---|---|
| 命名导出(变量) | export const a = 1; export let b = 2; export var c = 3; |
✅ 必须分号 | ✅ 允许声明+赋值 | ✅ 允许表达式 | 必须同时声明和初始化 |
| 命名导出(函数) | export function foo() {} export class Bar {} |
❌ 禁止分号 | ✅ 允许声明 | ✅ 允许函数/类体 | 函数/类声明后不能跟分号 |
| 命名导出(已存在变量) | export { a, b as c }; |
✅ 必须分号 | ❌ 只引用已声明变量 | ❌ 不允许表达式 | 必须使用大括号,变量必须已存在 |
| 默认导出(匿名) | export default function() {}; export default class {}; |
✅ 必须分号 | ✅ 允许匿名声明 | ✅ 允许表达式 | 匿名函数/类需要分号 |
| 默认导出(具名) | export default function foo() {} export default class Bar {} |
❌ 禁止分号 | ✅ 允许具名声明 | ✅ 允许函数/类体 | 具名函数/类声明后不能跟分号 |
| 默认导出(表达式) | export default 42; export default a + b; |
✅ 必须分号 | ❌ 不允许声明 | ✅ 必须表达式 | 只能跟单个表达式 |
| 复合导出 | export * from './mod'; export { a } from './mod'; |
✅ 必须分号 | ❌ 不允许声明 | ❌ 不允许表达式 | 只能重新导出其他模块 |
详细语法规则分析
声明式导出 vs 表达式式导出
| 特性 | 声明式导出 | 表达式式导出 |
|---|---|---|
| 语法形式 | export function/class/const/let/var |
export default expression |
| 分号规则 | 声明语句规则(函数/类无分号) | 必须分号 |
| 提升行为 | 函数/类会提升 | 不会提升 |
| 重复导出 | 不能重复声明 | 可以多次默认导出(但只有最后一个生效) |
// ✅ 正确的用法
export const name = "Alice"; // ✅ 分号
export function calculate() { } // ✅ 无分号
export class User { } // ✅ 无分号
export { name as userName }; // ✅ 分号
export default function() { }; // ✅ 分号(匿名)
export default class { }; // ✅ 分号(匿名)
export default 42; // ✅ 分号
// ❌ 错误的用法
export const name = "Alice" // ❌ 缺少分号
export function calculate() { }; // ❌ 多余分号
export class User { }; // ❌ 多余分号
export { name as userName } // ❌ 缺少分号
export default function() { } // ❌ 缺少分号(匿名)
分号使用规则详解
必须使用分号的情况
| 场景 | 示例 | 原因 |
|---|---|---|
| 变量声明导出 | export const a = 1; |
变量声明语句需要分号 |
| 引用导出 | export { a, b }; |
语句块需要分号结束 |
| 默认导出表达式 | export default a + b; |
表达式语句需要分号 |
| 匿名默认导出 | export default function() {}; |
函数表达式需要分号 |
禁止使用分号的情况
| 场景 | 示例 | 原因 |
|---|---|---|
| 函数声明导出 | export function foo() {} |
函数声明禁止分号 |
| 类声明导出 | export class Bar {} |
类声明禁止分号 |
| 具名默认导出 | export default function foo() {} |
函数声明禁止分号 |
声明与赋值限制
允许同时声明和赋值的类型
| 导出类型 | 是否允许 | 示例 |
|---|---|---|
| const | ✅ 允许 | export const PI = 3.14; |
| let | ✅ 允许 | export let count = 0; |
| var | ✅ 允许 | export var global = {}; |
| function | ✅ 允许(自动初始化) | export function init() {} |
| class | ✅ 允许(自动初始化) | export class Component {} |
不允许单独声明的情况
// ❌ 不允许的用法
export let count; // ❌ 必须初始化
export const MAX_SIZE; // ❌ const必须初始化
export var config; // ❌ 必须初始化
// ✅ 正确的用法
let count = 0;
export { count }; // ✅ 先声明后导出
const MAX_SIZE = 100;
export { MAX_SIZE }; // ✅ 先声明后导出
表达式限制规则
允许的表达式类型
| 表达式类型 | 是否允许 | 示例 |
|---|---|---|
| 字面量 | ✅ 允许 | export default 42; |
| 算术表达式 | ✅ 允许 | export default a + b; |
| 函数表达式 | ✅ 允许 | export default function() {}; |
| 类表达式 | ✅ 允许 | export default class {}; |
| 对象表达式 | ✅ 允许 | export default { key: 'value' }; |
| 数组表达式 | ✅ 允许 | export default [1, 2, 3]; |
不允许的表达式上下文
| 上下文 | 问题 | 错误示例 |
|---|---|---|
| 多个表达式 | 只能导出一个值 | export default a, b; ❌ |
| 语句块 | 不能导出语句块 | export default { a: 1; b: 2 } ❌ |
| 未完成表达式 | 表达式必须完整 | export default a + ❌ |
特殊语法限制
重复导出限制
| 限制类型 | 规则 | 示例 |
|---|---|---|
| 同名命名导出 | 不允许重复名称 | export const a = 1; export function a() {} ❌ |
| 多个默认导出 | 语法允许但只有最后一个生效 | export default 1; export default 2; ⚠️ |
| 混合默认和命名 | 允许同时存在 | export default main; export { util }; ✅ |
作用域限制
| 作用域 | 导出能力 | 示例 |
|---|---|---|
| 块级作用域 | 不能导出块内变量 | { const a = 1; export { a }; } ❌ |
| 函数作用域 | 不能导出函数内变量 | function test() { export const a = 1; } ❌ |
| 模块顶级作用域 | 所有导出必须在顶级 | export const a = 1; ✅ |
实际开发建议
代码风格推荐
| 场景 | 推荐写法 | 理由 |
|---|---|---|
| 多个相关导出 | export { a, b, c }; |
集中管理,清晰明了 |
| 主要功能导出 | export default mainFunction; |
明确主要接口 |
| 工具函数导出 | export const utils = { ... }; |
便于Tree-shaking |
| 配置常量导出 | export const CONFIG = { ... }; |
常量集中管理 |
常见错误避免
// ❌ 避免这些错误
export let uninitialized; // 未初始化
export default const x = 1; // 错误组合
export { a as default, b }; // 混合默认和命名
// ✅ 使用这些正确形式
export let initialized = null; // 正确初始化
const x = 1; export default x; // 分离声明和导出
export { a, b }; export default a; // 分开导出