JavaScript 的工作原理
JavaScript 是一种**高级解释型编程语言**,常用于 Web 开发以创建动态和交互式网页。它可在浏览器(客户端)和服务器(服务器端,使用 Node.js 等环境)上运行。要了解 JavaScript 的工作原理,需要了解其执行模型、环境以及调用堆栈、事件循环和异步行为等关键机制的几个概念。
以下是 JavaScript 工作原理的概述:
1.执行上下文和调用堆栈
JavaScript 代码在**单线程环境**中执行,这意味着一次只能处理一个操作。JavaScript 引擎使用**调用堆栈**来跟踪函数调用。
调用堆栈
例子:
function first() { console.log('First function'); } function second() { first(); console.log('Second function'); } second();
**流动**:
2. 事件循环
JavaScript 本质上是**非阻塞**的,这意味着它可以执行异步任务而不阻塞主线程(浏览器中的 UI 线程)。
异步执行示例:
console.log("Start"); setTimeout(() => { console.log("Timeout 1"); }, 1000); setTimeout(() => { console.log("Timeout 2"); }, 500); console.log("End");
**流动**:
输出:
Start End Timeout 2 Timeout 1
3. 执行环境
JavaScript 在不同的环境中运行,每个环境都有特定的全局对象和功能:
浏览器中的**全局对象**是`window`,在Node.js中则是`global`。
4. 同步代码与异步代码
JavaScript 可以执行同步和异步代码。
同步代码示例:
console.log("A"); console.log("B"); console.log("C");
输出:
A B C
异步代码示例:
console.log("A"); setTimeout(() => { console.log("B"); }, 1000); console.log("C");
输出:
A C B
这里的`setTimeout`是异步的,所以在“C”之后打印“B”。
5. JavaScript 中的事件处理
JavaScript 很大程度上依赖于事件,尤其是在 Web 开发中。例如,当您单击按钮时,浏览器会触发一个事件,JavaScript 可以监听并响应该事件。
事件驱动编程
在浏览器中,可以使用事件监听器捕获诸如“点击”,“提交”和“加载”等事件。
const button = document.querySelector('button'); button.addEventListener('click', () => { console.log("Button clicked!"); });
6. 闭包
JavaScript 函数可以“记住”其外部作用域,即使函数在该作用域之外执行也是如此。此功能称为**闭包**。
function outer() { let counter = 0; return function inner() { counter++; console.log(counter); }; } const increment = outer(); increment(); // 1 increment(); // 2
这里,即使“外部”函数已经执行完毕,内部函数仍然可以访问“计数器”。
7. 提升
在 JavaScript 中,**变量和函数声明**在执行阶段会被提升到其范围的顶部,这意味着它们甚至在代码中声明之前就已经可用。
console.log(foo()); // works because function is hoisted function foo() { return 'Hello!'; } console.log(bar); // undefined because `bar` is hoisted but not initialized yet var bar = 'World';
8.内存管理和垃圾收集
JavaScript 会自动管理内存。当对象不再需要时,它们会被标记为**垃圾回收**,并释放其占用的内存。
JavaScript 使用一种称为**标记-清除**的算法来检测和清理未使用的对象。