为什么 JavaScript 在没有 Web API 调用的情况下表现得像同步

Vis*_*hra -4 javascript asynchronous dom-events

我知道 JavaScript 本质上是同步的。因此,当我使用 Web API 调用函数时,它会同步执行:

setTimeout(function(){
  console.log('1');
}, 2000);

console.log('2');
Run Code Online (Sandbox Code Playgroud)

它将打印“2”然后是“1”。

但是当我运行像 for 循环这样的循环并增加迭代时,它会同步执行:

var first = function(){
    for(var i=0;i<=100000000;i++){
        if(i==100000000){
            console.log('first')
        };
    };
};

var second = function() {
    console.log('second')
};

var a = function() {
    first();
    second();
}

a();
Run Code Online (Sandbox Code Playgroud)

它将分别打印第一秒。

那么,JavaScript 是否与本机代码同步执行?

T.J*_*der 5

第一个例子是异步的,因为你已经明确要求它是通过使用异步的setTimeoutsetTimeout(及其关系setInterval)显式地为您传递给它们的函数设置了一个异步定时回调。

剩下的例子没有使用任何像setTimeout(和 ajax 之类的)那样创建异步的东西,所以它自然是同步的。

我知道 javaScript 本质上是异步的

不,JavaScript(语言)本质上是同步的。从字面上看,JavaScript 唯一的异步方面是在 ES2015 中添加的,它与回调传递到承诺的时间then或被catch调用有关。就是这样。setTimeout例如,不是 JavaScript 的一部分;它是主要使用 JavaScript(浏览器)的主机环​​境的一部分。(它也是一些非浏览器主机环境的一部分,比如 NodeJS。)

JavaScript 主要用于鼓励异步操作(浏览器)的环境中,它用于响应用户事件(异步)、ajax 完成(异步)和计时器回调(异步),但该语言几乎完全同步。