【问题标题】:Why does JavaScript behave like synchronous without web API call为什么 JavaScript 在没有 Web API 调用的情况下表现得像同步的
【发布时间】:2016-11-09 15:15:34
【问题描述】:

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

【问题讨论】:

  • “javaScript 本质上是异步的” - 不,它不是。
  • @Turnip 请你发一些链接给我看看。提前致谢
  • 看什么? ` `
  • Javascript 本质上不是异步的。

标签: javascript asynchronous dom-events


【解决方案1】:

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

其余示例不使用任何会创建异步的东西,例如 setTimeout(和 ajax 等),所以自然是同步的。

我知道 javaScript 本质上是异步的

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 据我所知 Array.forEach 方法是同步的。
    • @MarioAlexandroSantini 是的,我删除它
    【解决方案3】:

    我知道了

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

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

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

    检查这个javaScript Async behavior;

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 2018-06-23
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      相关资源
      最近更新 更多