真正能跑起来、可调试的“第一个程序”需绕开本地文件协议限制、script加载时机和var作用域陷阱:用http-server或Live Server启动,script放</body>前或加defer,优先使用let/const避免变量提升问题。

直接在浏览器控制台敲 console.log("Hello World") 就算开始了——但真正能跑起来、可调试、不踩坑的“第一个程序”,得绕开几个默认陷阱。
怎么让 JS 代码被浏览器执行(而不是当成纯文本)
很多人把 .js 文件双击打开,结果什么都没输出。因为浏览器直接读取文件时不会执行 JS(尤其是本地 file:// 协议下会触发 CORS 或 MIME 类型限制)。
- 用
http-server(推荐):npm install -g http-server && http-server
,然后访问http://localhost:8080 - 或者用 VS Code 插件 Live Server,右键 HTML 文件 → “Open with Live Server”
- 千万别用双击 HTML 文件的方式测试带外部
.js的页面——fetch、import、甚至某些console行为都会静默失败
script 标签放哪儿才不会报 Cannot read property 'xxx' of null
DOM 元素还没加载完,JS 就去查 document.getElementById("btn"),结果拿到 null——这是新手最常卡住的点。
- 把
<script>放在</body>之前(不是<head>) - 或者加
defer属性:<script src="main.js" defer></script>(适用于外部脚本) - 或者监听
DOMContentLoaded事件,而不是load(后者等图片、样式表全部加载完)
为什么 let 和 const 比 var 更安全
不是语法更酷,是它们能帮你提前暴露错误。比如:
立即学习“Java免费学习笔记(深入)”;
console.log(x); // ReferenceError: Cannot access 'x' before initialization let x = 1;
而 var x 会输出 undefined,掩盖了变量未声明/顺序错的问题。
- 函数作用域(
var)容易引发循环绑定问题;块级作用域(let/const)让逻辑更可控 -
const不代表“值不可变”,而是“绑定不可重赋值”;对象属性仍可修改,这点常被误读 - 现代编辑器和打包工具(如 Vite、Webpack)默认按 ES6+ 解析,用
var反而可能触发兼容性警告
真正的难点不在“写第一行”,而在理解执行时机、作用域边界和加载上下文——这些地方不显式出错,但会让后续所有调试都像在迷雾中找开关。











