ES6 export 语句 语法规范

以下回答由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;  // 分开导出

另:推荐阅读《模块转移导出详解》

模块转移导出详解

相关推荐
H***99762 小时前
Vue深度学习实战
前端·javascript·vue.js
猴猴不是猴2 小时前
js实现卷轴,中间可滑动方块,左右两侧对比
javascript·css·css3
toooooop82 小时前
Vuex 中 state、mutations 和 actions 的原理和写法
前端·javascript·uni-app
y***86692 小时前
前端CSS-in-JS方案
前端·javascript·css
华仔啊3 小时前
你真的懂递归吗?没那么复杂,但也没那么简单
前端·javascript
专业抄代码选手3 小时前
【Leetcode】1930. 长度为 3 的不同回文子序列
javascript·算法·面试
空空kkk4 小时前
SpringMVC——异常
java·前端·javascript
冴羽4 小时前
涨见识了,Error.cause 让 JavaScript 错误调试更轻松
前端·javascript·node.js
m***D2864 小时前
JavaScript在Node.js中的内存管理
开发语言·javascript·node.js