JavaScript是运行于多宿主环境的动态弱类型原型语言,核心机制包括执行上下文与调用栈、TDZ、事件循环、this绑定规则及原型链查找逻辑。

JavaScript 不是一门“用来做网页动效的脚本语言”这种过时定义能概括的——它是一门运行在宿主环境(浏览器、Node.js、Deno、甚至 Excel 或嵌入式设备)中的动态、弱类型、基于原型的编程语言,核心能力是响应事件、操作数据、控制执行流、与外部系统交互。
JavaScript 是怎么跑起来的:执行上下文和调用栈
初学者常以为 console.log() 是“直接打印”,其实它背后是一整套执行机制:代码一加载,JS 引擎就创建全局执行上下文;每次函数调用,就压入一个新的执行上下文到调用栈;变量提升(hoisting)本质是声明被提前注册进当前上下文的词法环境,但 let 和 const 有暂时性死区(TDZ),访问会抛出 ReferenceError。
- 函数表达式不会被提升,
typeof myFunc在声明前是"undefined";函数声明会被完全提升,可安全调用 -
setTimeout(() => {}, 0)不是“立刻执行”,而是把回调推入宏任务队列,等当前调用栈清空、微任务(如Promise.then)执行完后才轮到它 - 闭包不是“函数记住了外层变量”,而是函数对象内部的
[[Environment]]指针始终指向其定义时的词法环境
对象、原型链和 this 到底指谁
this 的值不取决于函数怎么定义,而取决于它怎么被调用。箭头函数没有自己的 this,它继承外层函数作用域的 this;普通函数的 this 在非严格模式下默认指向全局对象(浏览器中是 window),严格模式下为 undefined;用 call/apply/bind 可显式绑定。
-
obj.method()→this指向obj -
const fn = obj.method; fn()→this丢失,非严格模式下指向window -
class中的方法默认不绑定this,React 类组件里需在构造函数中用this.handleClick = this.handleClick.bind(this)或改用箭头函数属性 - 原型链查找只发生在读取属性时(
obj.x),赋值obj.x = 1总是在obj自身创建/覆盖属性,不会修改原型
异步不是“等一会儿”,而是事件循环驱动的协作式调度
JS 是单线程的,但通过事件循环(Event Loop)协调同步任务、微任务(microtask)、宏任务(macrotask)。Promise 链的每个 .then() 回调都是微任务,会在当前宏任务结束后、下一个宏任务开始前全部执行完毕;而 setTimeout、setInterval、I/O 回调属于宏任务。
立即学习“Java免费学习笔记(深入)”;
- 以下代码输出顺序是:
1→3→2→4 - 微任务优先级高于宏任务,哪怕
setTimeout(fn, 0)时间设为 0,也一定晚于所有已排队的Promise.then -
async/await是语法糖,await后面的表达式求值后,如果返回的是Promise,就会暂停函数执行,把后续代码包装成微任务;否则直接继续执行
console.log(1); setTimeout(() => console.log(2), 0); Promise.resolve().then(() => console.log(3)); console.log(4);
现代 JavaScript 开发绕不开的几个现实约束
你写的 JS 最终要运行在各种环境中:旧版 Safari 可能不支持 ??(空值合并)或 ?. (可选链),Node.js 版本不同导致 fs.promises 不可用,ESM 模块在某些构建工具里需额外配置才能解析 import.meta.url。不要假设“语法合法 = 运行正常”。
- 用
const和let替代var,避免变量提升带来的意外行为 - 用
Array.from()或扩展运算符[...iterable]处理类数组(如document.querySelectorAll()返回的NodeList),别直接调.map() - 处理用户输入或 API 响应时,用
typeof x === "string"而非x.constructor === String,后者在跨 iframe 场景下会失效 - 调试时善用
debugger语句和 Chrome DevTools 的 “Pause on caught exceptions” 功能,比盲目加console.log高效得多
真正卡住初学者的,往往不是概念本身,而是对“执行时机”“作用域边界”“this 绑定方式”“异步任务排队规则”的模糊感知。这些没法靠背定义掌握,得在反复调试真实报错(比如 Cannot read property 'xxx' of undefined、Promise rejected with no error、this is undefined in event handler)中建立直觉。











