我的答案是(现已修改为正确答案 并 通过运行验证):
(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
不知道是否正确,可以顺便讲一下考点吗?方便查缺补漏,感谢~
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
.