ES6箭头函数

ES6的箭头函数其实就是词法作用域的一种方式,它本身没有this,所以会向上寻找有this的作用域当做自己的作用域;而普通函数的this是运行时动态绑定的,也就是指向调用者的作用域(上下文环境)

所以呢?

function Person() {
  var self = this; 
  self.age = 0;

  setInterval(function growUp() {
    self.age++;
  }, 1000);
}

// 可以改成这么写,是不是简化了很多?
function Person() {
  this.age = 0;
  setInterval(() => {
    this.age++; // 这个this指向的就是箭头函数外面的this
  }, 1000);
}

// 那如果这样呢?套嵌箭头函数呢?
function Person() {
  this.age = 0;
  setInterval(() => {
    
     setTimeout(() => {
        this.age++; // 这个this呢?由于它会像父级作用域寻找,发现是箭头函数,没有this可以绑定,那继续往上找,找了person的作用域中的this,进行了绑定,所以这个this也是指向了person所在的作用域;
     }, 500);

  }, 1000);
}

此外注意两点:

  • 不能使用arguments对象,它在箭头函数中不存在
  • 由于this在箭头函数中被绑定了,不能使用call(),apply(),bind()等函数改变箭头函数的this指向