Node.js中无回调/Promise时JS执行顺序疑问:是否全异步?
Node.js中JavaScript同步与异步的核心逻辑解答
核心问题:无回调/Promise时,函数都是异步执行吗?
当然不是。JavaScript是单线程同步执行的语言,只有当代码涉及明确的异步操作(比如I/O请求、setTimeout/setInterval、Promise、async/await、事件监听回调等)时,才会触发异步逻辑。普通的函数调用、循环、变量赋值这类代码,都是同步执行的,会严格按照代码书写的顺序依次完成,不会被中途打断。
第一个代码示例分析
let arr = [] for (let i = 0; i < 600; i++) { arr.push(i) } console.log(arr) arr = [] console.log(arr)
这段代码里的所有操作都是同步的:
- 先完整执行完for循环,把0到599全部push进数组
- 执行第一个
console.log输出完整数组 - 再将
arr置为空数组 - 最后执行第二个
console.log输出空数组
绝对不会出现循环还在push元素时,arr就被清空的情况,你多次运行没异常不是巧合,这是JavaScript单线程同步执行机制的必然结果。
第二个代码示例分析
function foo(num) { console.log(num) } let a = 0 foo(a) a = 1
这里的函数调用和变量赋值都是同步操作,执行顺序是:
- 声明变量
a并赋值为0 - 调用
foo(a),此时a的值是0,所以console.log输出0 - 最后执行
a = 1,将变量a的值改为1
foo(a)永远会输出0,不可能出现先执行a=1再调用foo(a)的情况。这类纯同步的场景完全不需要添加Promise,完全是多余的操作。
内容的提问来源于stack exchange,提问作者Hawkeyebrow
相关产品推荐
相关产品推荐

