javascript模块导出的是变量的活绑定而非值拷贝,命名导出支持多个值导出并可重命名,默认导出每模块仅一个;导入需在顶层且用字符串字面量,绑定更新实时可见。

在 JavaScript 中,export 本身不能直接“共享模块作用域变量”的值,而是导出对变量的**绑定(binding)**——也就是说,导出的是变量的引用,不是快照。只要该变量是顶层声明(let、const、var 或函数/类),且未被重新赋值为新绑定(如 let x = ... 后又 x = ...),导入方读取时始终看到最新值。
导出变量的常见方式
必须在模块顶层(非函数内)使用 export,有命名导出和默认导出两种主流形式:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
命名导出(Named Export):适合导出多个值,导入时需用对应名称或别名
// math.jsexport let count = 0;export const PI = 3.14159;export function increment() { count++; } -
统一命名导出(Export List):更清晰地集中声明
// utils.jslet version = "1.2";function log() { console.log(version); }export { version, log }; -
默认导出(Default Export):每个模块最多一个,导入时可自定义名称
// main.jsconst config = { theme: "dark" };export default config;
关键细节:绑定 vs 值
ES 模块导出的是**活绑定(live binding)**,不是拷贝。这点和 CommonJS 的 module.exports 不同:
- 如果导出的是
let或var声明的变量,且在模块内被修改,导入方通过 getter 读取时会拿到更新后的值; -
const声明的变量不可重新赋值,但若其值是对象或数组,内部属性仍可修改,导入方也能看到变化; - 函数和类导出后,即使模块内重定义(不推荐),也不会影响已导出的绑定 —— 因为导出发生在模块求值阶段。
导入时如何使用
导入语句也需在模块顶层,且必须使用字面量字符串(不能动态拼接):
- 导入命名导出:
import { count, increment } from './math.js'; - 导入并重命名:
import { count as currentCount } from './math.js'; - 导入全部命名导出:
import * as math from './math.js'; // math.count, math.increment - 导入默认导出:
import config from './main.js'; // 注意无大括号 - 同时导入默认 + 命名:
import config, { version } from './utils.js';
注意事项
- 不能在条件语句、循环或函数中使用
export(语法错误); - 导出的变量不能在导出语句前访问(存在暂时性死区,类似
let); - 浏览器中需以
<script type="module"></script>加载,Node.js 需启用"type": "module"或使用.mjs后缀; - 避免导出未初始化的
let/const变量(如let x;后立即export { x };),虽然合法,但读取时值为undefined,易引发误解。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










