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 使用一种称为**标记-清除**的算法来检测和清理未使用的对象。