javascript模块中不存在“默认绑定”,其顶层this恒为undefined,作用域为独立的静态词法作用域,导出与导入基于只读活引用而非对象挂载或值拷贝。

JavaScript 模块中不存在“默认绑定”这种说法——这是容易混淆的概念。模块本身不涉及 this 的默认绑定(如非严格模式下全局对象绑定),而是天然运行在严格模式下,且拥有独立的模块作用域。
模块作用域是隔离的顶层作用域
每个 <script type="module"></script> 或 ES 模块文件(.js)都构成一个独立的模块作用域。这个作用域既不是全局作用域,也不是函数作用域,而是一种顶层、静态、词法确定的作用域:
- 模块内用
let、const、function声明的变量/函数,仅在该模块内可见 - 模块顶层的
this值为undefined(因模块自动启用严格模式) - 不同模块即使声明同名变量(如
let user = "Alice"),也互不影响
导出不是“绑定到某个对象”,而是显式暴露接口
模块导出(export)的本质是定义当前模块对外提供的**命名或默认接口**,而非将变量挂载到某个上下文对象上:
-
export const name = "John";→ 导出一个名为name的绑定(实时绑定,值可变) -
export default function() {}→ 导出一个默认值,导入时可任意命名 - 导出的是“活引用”,不是值拷贝;若导出的是对象,修改其属性会影响所有导入方
导入创建的是只读绑定,不是作用域继承
使用 import 并不会把被导入模块的变量“拉进”当前模块作用域,而是建立一个只读的、与源模块同步的绑定:
-
import { name } from "./mod.js"中的name是对源模块name的间接引用 - 不能重新赋值(
name = "Bob"报错),但若name是对象,可修改其属性 - 导入语句必须位于模块顶层,不可动态执行,体现其静态性
没有“默认绑定”,只有模块级词法作用域
所谓“默认绑定”常被误用于描述非严格模式下函数调用时 this 指向全局对象的行为。但在模块环境中:
- 模块自动启用严格模式,
this在顶层永远是undefined - 导出/导入机制与
this绑定完全无关,它依赖的是模块解析和静态绑定规则 - 作用域链由词法嵌套决定:模块作用域 → 外层(无)→ 全局(不可访问模块内变量)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











