需要知道的那些事:

1.JS是单线程的(为什么?因为能提高效率。作为浏览器脚本语言,js的主要用途是与用户互动,操作DOM。而这也就决定它只能为单线程,否则会带来很复杂的同步问题),也就是说无法同时执行好几段代码,都是从上往下一句一句的执行,前面的代码要先于后面的代码一步被执行。如:

1 var a=12;
2 var b=15;//js在运行的时候,先执行把12赋值给a的操作,再执行把15赋值给b的操作

2.同步VS异步

同步:在同一时间,你只能做一件事情,即使这件事情会花费很长时间,但依旧需要你坚守在那里直到事情处理完毕;

异步:你在做一件事情时,因为这件事情会花费很长时间,在这等待过程中你可以先去处理其他事情,等这件事轮到你的时候再过来处理她即可。

差别:在于这条流水线上各个流程的执行顺序不同。

setTimeOut(定时器)VSsetTimeInterval(间隔定时器)

在js当中最基础的异步操作就是setTimeOut()以及setTimeInterval()了。

1.setTimeOut()方法用于在指定的毫秒数后执行某些操作;

 //3秒后弹出“Hello”
var myVar; function myFunction() {
myVar = setTimeout(alertFunc, 3000);
} function alertFunc() {
alert("Hello!");
}

2.API:

 var id = setTimeout(fn,timer);
//fn是执行函数
//timer间隔时间
//返回一个id值,在fn未触发之前,可以通过clearTimeout(id)清除,从而不执行fn
clearTimeout(id);

3.使用clearTimeOut()方法来阻止函数的执行;

4.返回一个 ID(数字),可以将这个ID传递给 clearTimeout() 来取消执行。


1.setInterval描述的是每隔多少时间执行某操作;

2.setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数;

3.API:

        var id = setInterval(fn,timer);
//fn是要执行的函数,
//timer是间隔时间
//返回一个id,用于将来某个时间用clearInterval清除间隔定时器
clearInterval(id);

区别与联系:

1.首先从概念上来说明,setTimeout多少时间之后执行某操作,只执行一次,而setInterval每隔多少时间之后执行某操作,如果不用clearInterval清除的话,将会一直执行下去;

2.两个方法都返回一个id值,用于清除定时器,分别是clearTimeout和clearInterval;

3.再次从性能上来说,setTimeout的性能是要优于setInterval的;

4.setTimeout和setInterval都不能保证到了时间点一定会执行,如:setTimeout(fn,5000),并不能保证5s之后一定能执行fn。这得取决于当前js线程队列里面还有没有其他待处理队列,如果刚好没有的话,那么就能刚好执行,如果当前线程里面已经有了其它待处理队列正在执行,那么需要排队,等到javascript线程空闲的时候才会执行定时器;

5.setTimeout是等待循环的操作执行完成之后,才继续在间隔时间之后再把循环操作添加到javascript的线程里面,而setInterval是不等待的,它从来不管放在线程里面循环操作有没有执行完成,反正到点就会把循环操作添加到javascript线程队列里面;

6.能用setInterval实现的操作,一定能用setTimeout来实现。

任务队列:

1.是一个事件的队列或者消息的队列。

2.所有任务都是在主线程上执行,形成一个执行栈(execution context stack);

3.执行完js主线程的代码才会去看浏览器任务队列中的事件,再执行js代码中该事件对应的代码;

4.任务队列里放的是ajax这类的任务,是交给浏览器发起HTTP请求去执行的,当有了返回结果就会在任务队列中增加一个事件表示该ajax请求已经返回了结果,任务队列里的任务和js主线程是同时执行的。 不影响js是单线程的这个结论,只能说浏览器还会提供接口来供js

实现异步操作;

5.一旦执行栈中所有同步任务执行完毕,系统会自动读取“任务队列”中的看看有什么事件,那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行;

6.主线程不断重复上面的第5步(只要主线程空了,就会读取任务队列,这个过程会不断重复,这也就是js的运行机制)。

js同步 异步 运行机制的更多相关文章

  1. 【译】深入理解python3.4中Asyncio库与Node.js的异步IO机制

    转载自http://xidui.github.io/2015/10/29/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3python3-4-Asyncio%E5%BA%93% ...

  2. JavaScript的异步运行机制

    ----异步运行机制如下: 1.左右同步任务都在主线程上执行,形成一个执行栈 2.主线程值外,还存在一个任务队列,只要异步任务有了运行结果,就在任务队列中放置一个事件 3.一旦执行栈中的所有同步任务执 ...

  3. js 同步 异步 宏任务 微任务 文章分享

    分享一篇 写的很好的 宏任务 微任务  同步异步的文章 文章原地址: https://juejin.im/post/59e85eebf265da430d571f89 这一次,彻底弄懂 JavaScri ...

  4. Node.js和PHP运行机制对比

    为什么要用node.js它又有什么优势呢?一个新的技术被大家喜爱那么它就必然有它的优势,那么下面我们就来简单把它和php做一个对比 1 . Node.js 他用的是JavaScript引擎,那么注定它 ...

  5. js同步-异步-回调

    出处:https://blog.csdn.net/u010297791/article/details/71158212(1)上面主要讲了同步和回调执行顺序的问题,接着我就举一个包含同步.异步.回调的 ...

  6. 十四、JS同步异步知识点,重点(Node.js-fs模块补充篇)

    (本片文章如果你能耐着性子看我,保证会对同步和异步有一个非常深刻的理解) JavaScript是单线程执行,所谓的单线程呢就是指如果有多个任务就必须去排队,前面任务执行完成后,后面任务再执行.因为Ja ...

  7. 【java回调】同步/异步回调机制的原理和使用方法

    回调(callback)在我们做工程过程中经常会使用到,今天想整理一下回调的原理和使用方法. 回调的原理可以简单理解为:A发送消息给B,B处理完后告诉A处理结果.再简单点就是A调用B,B调用A. 那么 ...

  8. JS 冷知识,运行机制

    数组取最小.最大值 var a=[1,2,3,5]; alert(Math.max.apply(null, a));//最大值 alert(Math.min.apply(null, a));//最小值 ...

  9. 浅析JS异步执行机制

    前言 JS异步执行机制具有非常重要的地位,尤其体现在回调函数和事件等方面.本文将针对JS异步执行机制进行一个简单的分析. 从一份代码讲起 下面是两个经典的JS定时执行函数,这两个函数的区别相信对JS有 ...

随机推荐

  1. Chrome驱动安装问题

    1.org.openqa.selenium.WebDriverException: unknown error: call function result missing 'value' 原因:浏览器 ...

  2. 实现接口时@Override注解问题

      用IntelliJ 15打开一个以前的工程,发现代码出现很多关于@Override的错误,编辑器提示:“@Override is not allowed when implementing int ...

  3. 第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式

    第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式 我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/en ...

  4. 《深入理解Java虚拟机》读书笔记:Java内存区域

    xmind文件下载地址

  5. Java如何使用重载方法处理异常?

    在Java编程中,如何使用重载方法处理异常? 此示例显示如何使用重载方法来处理异常.需要在每个方法中使用try catch块. package com.yiibai; public class Exc ...

  6. e832. 从JTabbedPane中移动卡片

    To move a tab, it must first be removed and then reinserted into the tabbed pane as a new tab. Unfor ...

  7. 多媒体开发之rtmp---rtmp client 端的实现

    去年我就在流媒体朋友圈认识winlin 老乡,本来想参与srs的开发,可惜今年5月份身体不好,今天想起rtmp 做直播,有翻到老乡的博文如下: http://blog.csdn.net/win_lin ...

  8. C# 窗口自适应窗口宽度和高度

    其实winform并不适合做自适应这玩意的,虽然,能做是能做, 就像菜刀一样能切水果,但是,不是那么合适,毕竟有水果刀 wpf做自适应拉伸窗体,会更好一些. 代码: #region 自适应 priva ...

  9. C# 把字符串中间的多个连续的空格转化成一个空格

    今天在弄帮客户将txt文件中的信息导入到数据库中,遇到了这个问题.因为客户的txt文件中两个字符串之间的空格数量不确定,没有办法使用split函数来分割,最后想到的办法是,将连续的空格转成一个空格,然 ...

  10. sublime text3支持Vue语法高亮显示

    1.下载文件链接: 或https://github.com/vuejs/vue-syntax-highlight 解开压缩包vue-syntax-highlight-master,其内所有文件备用. ...