HTML本身无全局变量概念,所谓“全局变量”实为JavaScript将var声明或显式挂载到window对象的属性;let/const因块级作用域不会自动挂载,故不可跨script访问。

HTML 里根本没有全局变量这个概念
HTML 是标记语言,不是编程语言,它本身不支持变量声明。你看到的所谓“全局变量”,实际是 JavaScript 在浏览器环境里挂载到 window 对象上的属性,或者用 var 声明在全局作用域的变量——但这是 JS 的行为,和 HTML 无关。
怎么让 JS 变量在多个 script 标签里都能用
常见场景:一个 <script></script> 里定义了配置,另一个里想读取。关键不是“写在哪”,而是“什么时候执行”和“挂到哪”。
- 把定义变量的
<script></script>放在或页面顶部,确保它先执行 - 用
var config = {apiUrl: 'https://api.example.com'};(注意不用let/const,它们不会挂到window) - 或者显式挂载:
window.API_BASE = 'https://api.example.com'; - 后续所有
<script></script>都能直接访问config或API_BASE
为什么用 let/const 声明的变量不行
let 和 const 是块级作用域,即使写在最外层脚本里,也不会自动成为 window 的属性。这是 ES6 明确规定的,不是 bug。
比如:
立即学习“前端免费学习笔记(深入)”;
let user = 'admin'; console.log(window.user); // undefined
而:
var user = 'admin'; console.log(window.user); // 'admin'
容易被忽略的加载顺序和作用域污染问题
很多人以为只要变量名没冲突就安全,其实不然。
- 多个第三方脚本都用
var $或var _,会互相覆盖 - 异步加载的
<script async></script>或动态插入的脚本,执行时机不可控,可能读不到前面定义的变量 - 现代项目用模块化(ESM),
import/export才是正解,window挂载只是临时兼容手段
真要跨脚本共享数据,优先考虑 localStorage、CustomEvent 或封装成 IIFE 模块,而不是依赖 window 上的裸变量。


















