JavaScript在浏览器中靠引擎(如V8)解析执行:先生成AST再转字节码;通过调用栈与事件循环实现单线程异步;作用域链与闭包决定变量访问;内存由堆栈分配并自动垃圾回收。
JavaScript 在浏览器中运行,靠的是内置的 JavaScript 引擎(比如 Chrome 的 V8、Firefox 的 SpiderMonkey),它把人类写的代码一步步翻译成机器能理解的指令并执行。
浏览器拿到 HTML 后,遇到 标签或 src 外链 JS 文件,就会开始下载并解析。解析不是直接执行,而是先生成抽象语法树(AST),再转换成字节码或机器码。
async 或 defer
async:下载不阻塞,下载完立刻执行(可能打乱顺序)defer:下载不阻塞,等 HTML 解析完、DOM 构建好后再按顺序执行JS 是单线程语言,靠“调用栈”管理函数执行,靠“事件循环”协调异步任务。同步代码进调用栈,立刻执行;异步操作(如定时器、网络请求)先交给浏览器 API 处理,完成后把回调放进任务队列,等调用栈空了,事件循环再把它推入栈中执行。
setTimeout、setInterval、I/O 等Promise.then、queueMicrotask、MutationObserver
每执行一个函数,JS 引擎就创建一个执行上下文(Execution Context),包含变量对象(VO)、作用域链(Scope Chain)和 this 值。全局代码也有自己的上下文。作用域链决定了变量查找顺序——先找当前作用域,找不到就沿链向上找父级,直到全局。
let/const 有暂时性死区(TDZ),声明前访问会报错;var 会变量提升但初始化为 undefined
JS 自动管理内存:分配给对象、数组、函数等的数据存在堆(heap)里;基本类型(number、string、boolean 等)存在栈(stack)里。当变量不再被任何活跃的执行上下文或闭包引用时,垃圾回收器(GC)会在合适时机回收对应内存。
console.log 有时会意外保留对象引用,调试完记得删掉基本上就这些——引擎解析、单线程调度、作用域规则、自动内存管理,四者配合让 JS 在浏览器里跑起来。不复杂但容易忽略细节。