请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于异步执行回调函数时间的问题

https://img1.sycdn.imooc.com/szimg//595a44250001541107290561.jpg

据我了解,虽然JS引擎是单线程执行程序的,但是浏览器是拥有多进程的,其中有类似于一个定时器进程来处理setTimeout()函数的,当setTimeout()到时间了,再把setTimeout()中的回调函数添加到任务队列中排队等待JS引擎在空闲的时候执行。所以我理解的setTimeout()中的这1s是加入到定时器进程中就开始计时倒数的(它应该是和JS引擎并行执行的倒计时),而不是像老师您在视频说的先把setTimeout()暂存起来,等轮到它执行的时候才开始倒数的。同理ajax等异步应该都有相应的浏览器进程作相应的处理。

这是我的个人理解,关于和您视频里讲的不同的理解带来的困惑,请老师解答下

正在回答 回答被采纳积分+3

1回答

双越 2017-07-03 22:08:23

“所以我理解的setTimeout()中的这1s是加入到定时器进程中就开始计时倒数的(它应该是和JS引擎并行执行的倒计时),而不是像老师您在视频说的先把setTimeout()暂存起来”——我近期看过一篇文章是这样说的,我觉得也有道理。

其实针对这一问题,我觉得也没必要过于纠结,还是实用为主,了解大体的执行过程即可。继续往下看,先把整个教程看完。

1 回复 有任何疑惑可以回复我~
  • 关于这个我也有疑问,setTimeout()里的函数的确是被暂存起来了,那么应该是这时候继续执行接下来的任务,然后当一秒过了就执行被暂存的函数。
    也就是说,如果setTimeout()之后的任务很多,在把这些任务执行完之前就已经过了一秒了,那被暂存的函数应该是在一秒过后马上执行,执行完后再接着执行下面的其他任务。
    如果是老师您说的把setTimeout()给暂存起来的话,那么就要等在所有任务执行完后再等一秒执行其中的函数了。
    
    所以我认为过程是这样的:
    遇到setTimeout()时,将其中的函数暂存,同时开始计时(这个是浏览器的工作吧?就像这个问题提问者说的计时器的作用),然后继续执行setTimeout()之后的任务,(假定这之后的任务很多,一秒后还没执行完)一秒后正在执行的任务执行完了就马上执行被暂存起来的函数,执行完后再从刚才已经执行到的地方继续执行接下来的任务。
    
    您觉得如果这样理解可以吗?
    回复 有任何疑惑可以回复我~ 2017-08-21 00:46:27
  • 阿好像也不对……因为这样子的话感觉不能解释setTimeout里时间设置为0的情况了……因为按照我这个理解的话时间如果为零那就应该是马上执行而不会等其他任务执行后再执行了
    回复 有任何疑惑可以回复我~ 2017-08-21 01:02:16
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信