function Timer(){
this.s1=0
this.s2=0
setInterval(()=>this.s1++,1000)
setInterval(function(){
this.s2++
},1000)
}
var time=new Timer()
setTimeout(()=>console.log('time.s1',time.s1),3100)
setTimeout(()=>console.log('time.s2',time.s2),3100)
setTimeout(()=>console.log('s1',s1),4100)
setTimeout(()=>console.log('s2',s2),4100)
setTimeout(()=>console.log('s1',s1),5100)
setTimeout(()=>console.log('this.s1',this.s1),5100)
setTimeout(()=>console.log('this.s2',this.s2),5100)
setTimeout(()=>console.log('s1',s1),6100)
结果
在new Timer()时this.s1=0和this.s2=0的this指向了time,time有了s1和s2属性。
setInterval定时器里有箭头函数的this指向time,所有3秒后打印3,没有箭头函数的this指向全局window。这里执行了3次。
s1和s2,s1都没有被定义过,说以报错, s2最起码定义了一下,undefined++等于NaN,window.s2++等于NaN,s2赋值等于NaN
再次打印时,this.s1,window.s1等undefined,s2还是NaN s1始终未被定义报错