JavaScript: setTimeout & setInterval


let i = 0
setTimeout(function (n) {
  console.log(55, n)
}, 1000, setTimeout(function () {
  console.log(44, i)
  i++
  return i+2
}))

先计算第三参数, 返回值为Timeout对象, 传递给第一参数, 浏览器中返回window

const obj = {
  a: function () {
    console.log(this)
    setTimeout(function () {
      console.log(this)
    }, 1000)
  }
}

// obj.a()

let b = obj.a
b()

Node:

Browser:

Node中指向Timeout对象, Browser中指向全局window

const obj = {
  a: function () {
    console.log(this)
    setTimeout(function () {
      console.log(this)
    }, 1000)
  }
}

obj.a()

Node:

 Browser:

Arrow Function

const obj = {
  a: function () {
    console.log(this)
    setTimeout(() => { console.log(this) }, 1000)
  }
}

obj.a()

一致

const obj = {
  a: function () {
    console.log(this)
    setTimeout(() => { console.log(this) }, 1000)
  }
}

let b = obj.a
b()

Node

 Browser

当b执行时, this才确定, setTimeout的arrow function绑定刚确定的this