为什么javaScript表现得像没有web api调用的同步

时间:2016-07-07 10:28:13

标签: javascript asynchronous javascript-events

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

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

console.log('2');

它将打印' 2'然后' 1'

但是当我像循环一样运行循环并增加迭代时它会执行同步

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是否与本机代码同步执行

3 个答案:

答案 0 :(得分:4)

第一个示例是异步的,因为您已使用setTimeout明确要求使其异步。 setTimeout(及其关系setInterval)明确设置了一个异步定时回调函数。

其余的示例不使用任何创建异步的内容,例如setTimeout(以及ajax等),所以它自然会同步。

  

我知道javaScript本质上是异步的

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我知道了

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

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

enter image description here

和setTimeout显式设置了对函数的异步定时回调。

检查此javaScript Async behavior;