js 实现原理
JavaScript 实现原理
JavaScript 是一种动态类型、解释执行的脚本语言,其实现原理涉及引擎、运行时、事件循环等多个核心机制。
引擎与执行流程
V8 是 Chrome 和 Node.js 使用的 JavaScript 引擎,其工作流程分为解析、编译、执行三个阶段。代码首先被解析为抽象语法树(AST),随后通过 JIT(即时编译)技术转换为机器码执行。优化编译器(如 TurboFan)会对热点代码进行深度优化。
function add(a, b) {
return a + b;
}
// 多次调用后会被优化为机器码
内存管理
JavaScript 使用自动垃圾回收机制,主要基于标记-清除算法。V8 将堆内存分为新生代和老生代,新生代采用 Scavenge 算法(复制清除),老生代采用标记-清除与标记-整理结合的策略。闭包和全局变量可能导致内存泄漏。
事件循环
JavaScript 是单线程语言,依赖事件循环处理异步任务。任务分为宏任务(如 setTimeout)和微任务(如 Promise)。事件循环的每一轮会先执行所有微任务,再执行一个宏任务。
console.log(1);
setTimeout(() => console.log(2), 0);
Promise.resolve().then(() => console.log(3));
// 输出顺序:1, 3, 2
原型与继承
JavaScript 通过原型链实现继承。每个对象拥有隐式原型 __proto__,指向构造函数的 prototype 属性。ES6 的 class 是语法糖,底层仍基于原型。
function Person(name) {
this.name = name;
}
Person.prototype.sayName = function() {
console.log(this.name);
};
const person = new Person('Alice');
person.sayName(); // "Alice"
作用域与闭包
词法作用域在代码编写时确定。函数创建时会保存当前作用域链,形成闭包。闭包允许函数访问定义时的变量,即使函数在其他作用域调用。
function createCounter() {
let count = 0;
return function() {
return ++count;
};
}
const counter = createCounter();
counter(); // 1
counter(); // 2
类型系统
JavaScript 使用动态弱类型系统。原始类型(如 number、string)通过值传递,对象类型通过引用传递。类型转换规则复杂,== 会进行隐式转换,=== 严格比较类型和值。
1 + '2' // "12"
null == undefined // true
0 == false // true
异步编程
Promise 通过状态机管理异步操作,状态为 pending、fulfilled 或 rejected。async/await 是 Promise 的语法糖,通过生成器函数实现暂停和恢复执行。

async function fetchData() {
const res = await fetch('/api');
return res.json();
}






