hand
_1_11_133
4
返回栏目
0k
2k
1k
2k
1k
1k
1k
2k
2k
2k
1k
2k
1k
2k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
2k
1k
1k
2k
2k
2k
3k
3k
2k
3k
2k
3k
3k
3k
1k
2k
3k
2k
2k
3k
3k
2k
2k
6k
3k
2k
2k
5k
3k
4k
3k
3k
2k
4k
3k
3k
2k
3k
3k
1k
4k
4k
4k
2k
5k
3k
2k
3k
4k
3k
3k
4k
2k
3k
3k
4k
2k
2k
3k
4k
3k
3k
2k
5k
2k
3k
3k
3k
3k
2k
3k
3k
3k
2k
2k
2k
2k
3k
2k
2k
2k
3k
2k
2k
2k
2k
2k
2k
0.1k
0.2k
3k
2k
3k
2k
0.1k
2k
2k
4k
2k
2k
1k
2k
2k
3k
3k
3k
3k
2k
2k
3k
3k
3k
4k
3k
3k
4k
3k
2k
2k
3k
3k
3k
3k
3k
3k
2k
3k
3k
4k
4k
3k
3k
2k
2k
3k
2k
2k
1k
2k
3k
1k
2k
2k
2k
2k
2k
2k
2k
2k
2k
4k
2k
3k
2k
1k
2k
2k
2k
2k
2k
3k
2k
3k
1k
2k
2k
2k
0k
2k
2k
2k
2k
2k
2k
2k
3k
2k
2k
1k
1k
3k
2k
3k
1k
2k
1k
2k
2k
2k
2k
3k
1k
3k
2k
2k
2k
2k
2k
2k
1k
2k
2k
4k
3k
3k
2k
2k
2k
2k
2k
2k
4k
3k
3k
3k
2k
2k
2k
2k
2k
2k
3k
4k
返回前端 - Javascript栏目
作者:
贺及楼
成为作者
更新日期:2025-02-21 20:02:25
在前端开发的世界里,JavaScript 是一门至关重要的编程语言。而理解同步与异步代码的执行流程,是掌握 JavaScript 编程的关键。本文将聚焦于同步代码的执行流程,帮助大家清晰地认识其工作原理。
同步代码,简单来说,就是按照代码编写的顺序依次执行,前一个任务执行完成后,才会执行下一个任务。在执行过程中,如果遇到耗时的操作,整个程序会被阻塞,直到该操作完成。
console.log('第一步');
let sum = 2 + 3;
console.log('两数之和为:' + sum);
console.log('最后一步');
在这段代码中,console.log('第一步')
首先执行,输出“第一步”。接着,计算 2 + 3
的和并赋值给变量 sum
。然后,输出两数之和。最后,执行 console.log('最后一步')
。整个过程是顺序执行的,不会跳过任何一步,也不会在某个操作未完成时执行后续操作。
调用栈是 JavaScript 执行同步代码的核心机制。它是一个后进先出(LIFO)的数据结构,用于跟踪函数的调用过程。当调用一个函数时,会将该函数的执行上下文压入调用栈;当函数执行完毕后,会将其执行上下文从调用栈中弹出。
function add(a, b) {
return a + b;
}
function multiply(c, d) {
return c * d;
}
function calculate() {
let result1 = add(2, 3);
let result2 = multiply(result1, 4);
return result2;
}
let finalResult = calculate();
console.log('最终结果:' + finalResult);
步骤 | 操作 | 调用栈状态 |
---|---|---|
1 | 程序开始执行,调用 calculate 函数 |
calculate |
2 | calculate 函数内部调用 add 函数 |
calculate -> add |
3 | add 函数执行完毕,返回结果,从调用栈中弹出 |
calculate |
4 | calculate 函数内部调用 multiply 函数 |
calculate -> multiply |
5 | multiply 函数执行完毕,返回结果,从调用栈中弹出 |
calculate |
6 | calculate 函数执行完毕,返回结果,从调用栈中弹出 |
空 |
7 | 将 calculate 函数的返回值赋给 finalResult 变量 |
空 |
8 | 执行 console.log 语句 |
空 |
由于同步代码是顺序执行的,如果遇到耗时的操作,如网络请求、文件读取等,会导致整个程序阻塞。例如:
function longRunningTask() {
let start = Date.now();
while (Date.now() - start < 5000) {
// 模拟一个耗时 5 秒的操作
}
console.log('耗时操作完成');
}
console.log('开始执行');
longRunningTask();
console.log('后续操作');
在这个例子中,longRunningTask
函数会阻塞程序 5 秒钟,在这 5 秒钟内,后续的 console.log('后续操作')
语句不会执行,直到 longRunningTask
函数执行完毕。
虽然同步代码存在阻塞问题,但在某些场景下,它仍然是非常有用的。
对于一些简单的数学计算、数据处理等任务,使用同步代码可以保证代码的简洁性和可读性。例如:
let numbers = [1, 2, 3, 4, 5];
let sum = 0;
for (let i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
console.log('数组元素之和:' + sum);
在程序启动时,一些初始化操作,如变量赋值、配置加载等,通常可以使用同步代码来完成。例如:
let config = {
apiUrl: 'https://example.com/api',
timeout: 5000
};
// 其他初始化操作
同步代码按照编写顺序依次执行,通过调用栈来管理函数的调用过程。虽然同步代码简单易懂,但在遇到耗时操作时会导致程序阻塞。在实际开发中,我们需要根据具体的场景选择合适的编程方式,对于简单的计算和初始化操作,同步代码是一个不错的选择。通过深入理解同步代码的执行流程,我们可以更好地掌握 JavaScript 编程,为后续学习异步编程打下坚实的基础。
希望本文能帮助你对同步代码的执行流程有更清晰的认识。如果你在学习过程中遇到任何问题,欢迎随时交流。
前端 - Javascript
整章节共299节
快分享给你的小伙伴吧 ~