普通函数及箭头函数里的this

104 阅读1分钟
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始终未被定义报错