技术文摘
js的运行方式
js的运行方式
JavaScript作为一门广泛应用于网页开发的脚本语言,其运行方式对于开发者理解代码执行过程和优化程序性能至关重要。
JavaScript是一种单线程语言,这意味着在同一时间它只能执行一个任务。在浏览器环境中,js的运行与浏览器的渲染引擎等密切相关。当浏览器解析到包含js代码的页面时,会创建一个执行栈。执行栈是一个先进后出的数据结构,函数调用会被压入栈中,执行完毕后从栈中弹出。
例如,当页面加载一个简单的js函数:
function sayHello() {
console.log('Hello World');
}
sayHello();
浏览器会将 sayHello 函数的调用压入执行栈,然后执行函数内部的代码,打印出“Hello World”,最后函数执行完毕从执行栈弹出。
然而,单线程的特性在处理一些耗时任务时可能会导致页面卡顿。为了解决这个问题,JavaScript引入了异步机制。异步任务不会阻塞执行栈的执行,而是被放入任务队列中。任务队列分为宏任务队列和微任务队列。常见的宏任务如 setTimeout、setInterval、DOM 事件等;微任务如 MutationObserver、Promise.then 等。
当执行栈为空时,事件循环机制开始工作。事件循环会不断检查任务队列,先处理微任务队列中的所有任务,直到微任务队列为空,然后再处理宏任务队列中的一个任务,如此循环往复。
比如:
setTimeout(() => {
console.log('setTimeout');
}, 0);
Promise.resolve().then(() => {
console.log('Promise.then');
});
console.log('main');
在这段代码中,首先会打印“main”,因为它在主线程执行。然后,Promise.then 作为微任务被放入微任务队列,setTimeout 作为宏任务被放入宏任务队列。事件循环先处理微任务队列,打印“Promise.then”,再处理宏任务队列,打印“setTimeout”。
了解JavaScript的运行方式,有助于开发者更好地编写高效、无阻塞的代码,提升用户体验,让网页应用更加流畅和稳定地运行。
TAGS: 运行环境 JavaScript运行机制 单线程运行 解析执行
- 安装Levenshtein提示缺少依赖的解决方法
- Python Process Join问题:主进程为何会提前结束
- 使用 -c 指定配置文件后Filebeat仍加载etc目录下配置文件的原因
- Go 中 append 操作是否会修改 slice 底层 array 指针
- 把长得像字典的列表转变为真正字典的方法
- 不同操作系统下 Synchronized 变量的行为差异
- Python里怎样把代码存到变量并执行
- Go中实例化对象后为何不能立即调用需指针类型接收器的方法
- 一文读懂TypeScript与JavaScript的主要区别
- 长连接中对象生命周期是否真的延长了
- Golang切片转JSON为空的解决方法
- Docker Compose从Python迁移到Go的原因
- Go的UTF支持:一个有意思的限制
- Golang协程同步 避免所有协程休眠死锁错误的方法
- Python识别域名使用的是HTTP还是HTTPS协议的方法