一道关于事件循环的笔试题

image.png

我的答案是(现已修改为正确答案 并 通过运行验证):
(1)执行 new Counter()

// 执行new Counter()
timer1,NaN,1024
timer2,1,1024,
timer1,NaN,1024+996
timer1,NaN,1024+996*2
timer1,NaN,1024+996*3
timer1,NaN,1024+996*4
timer1,NaN,1024+996*5
timer1,NaN,1024+996*6
timer1,NaN,1024+996*7

(2)执行 Counter()

// 执行Counter()
timer1,1,1024
timer2,2,1024,
timer1,3,1024+996
timer1,4,1024+996*2
timer1,5,1024+996*3
timer1,6,1024+996*4
timer1,7,1024+996*5
timer1,8,1024+996*6
timer1,9,1024+996*7

不知道是否正确,可以顺便讲一下考点吗?方便查缺补漏,感谢~

阅读 1.6k
1 个回答

Counter()new Counter() 并不影响 timer 的执行顺序与时机。所以,两者 timer 的顺序与 gap 值应该是一样的。

JSON.parse 的时候,两个回调都无法执行,但是 timer1 的回调会被加入队列(这发生在 JSON.parse 结束之前,setInterval执行过 996ms 之后)。之后,timer2 的回调被加入队列。所以,一定是 timer1 的回调先执行,之后是 timer2 的。而且,两个 timer 回调第一次执行的时间几乎是一样的。(1024ms)

之后 8 次输出,都是 timer1 从回调上一次执行结束开始重新计时,1024+996 * n

Counter()new Counter() 会影响函数中的几个 this
Counter() 里,所有的 this 都是全局对象,大家是同一个。this.num 的输出会是 1,2,3, ....
但是,new Counter() 里,只有 timer1 回调里的 this 是全局对象,其它所有的 this 都是同一个新对象(new Counter() 的返回值)。于是,new Counter() 里,timer1 回调里的 this.num 是没有被初始化的(undefined),++ 之后是 NaN ,并且会一直是 NaN 。而 timer2 回调里的 this.num 会输出 1.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题