繁体   English   中英

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

[英]Why does JavaScript behave like synchronous without web API call

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

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

console.log('2');

它将打印“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();

它将分别打印第一秒。

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

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

其余的示例没有使用任何像setTimeout (和 ajax 等)那样创建异步的东西,所以自然是同步的。

我知道 javaScript 本质上是异步的

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

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

JS 是事件驱动的,这就是为什么你认为它是异步的.. 但它只有异步功能..

for循环没有任何事件回调,所以它只是同步

我知道了

JavaScript 是同步的,异步功能取决于您的函数实现。

它有一个事件循环并且它同步执行,但是每当它获得异步函数(采用回调的函数,即 setTimeout ,fs.readFile() 等)时,它不是 javaScript 的一部分,然后,它将函数放入队列并在所有本机代码(在当前范围内)执行后调用队列函数,然后弹出队列并调用函数。

在此处输入图片说明

和 setTimeout 显式地设置了一个异步定时回调函数。

检查此javaScript 异步行为

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM