你的浏览器不支持canvas

Enjoy life!

discrimination - this

Date: Author: JM

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。

一、 this辨析

1.1 es5 - this

  • 先看 es5语法下函数内的 this
  • 点击打开demo
var obj = {};

obj.getThis = function () {
  console.log(this);
};

obj.getThis(); // obj

// 等价以下写法

 var obj = {
  getThis: function () {
    console.log(this);
  }
};

obj.getThis();
  • 结果如图所示

relationship-map

1.2 es6 - this

  • es6 语法下函数内的 this
  • 点击打开demo
  • 箭头函数相当于直接在全局作用域中定义,所以 this 指向 window
var obj = {};

obj.getThis = () => {
console.log(this);
};

obj.getThis(); // window

// 等价于以下写法
var obj = {
  getThis: () => {
    console.log(this);
  }
};

obj.getThis(); // window

relationship-map


  • 例2
  • 点击打开demo
var obj = {};

obj.getThis = () => {
 return () => {
   console.log(this);
 }
}

obj.getThis()(); //window
  • 结果如图所示

relationship-map

1.3 来个混合写法

  • 例1:
  • 点击打开demo
  • 箭头函数是在 obj.getThis 函数中定义的,因此,this指向 obj
var obj = {};

obj.getThis = function () {
    return () => {
      console.log(this);
    };
}

obj.getThis()(); // obj

// 等价于

var obj = {
  getThis: function () {
    return () => {
      console.log(this);
    }
  }
};

obj.getThis()(); // obj
  • 结果如图所示

relationship-map


  • 例2:
  • 点击打开demo
  • 箭头函数是在 obj.getThis 函数的内部函数inner 中定义,但是,this指向 window
var obj = {};

obj.getThis = function () {
  var inner = function () {
    console.log(this);
  }
  inner();
}

obj.getThis(); // window
  • 结果如图所示

relationship-map


  • 例3
  • 点击打开demo
function outer () {
  return () => {
    console.log(this);
  }
}

outer()(); // window
  • 结果如图所示

relationship-map

1.4 总结

  • 普通函数中的 this 的指向取决于调用表达式的形式。
  • 箭头函数中的 this 的指向取决于箭头函数定义时所处的环境。
  • 混杂函数(不同函数和箭头函数的组合)中的 this 不一定是当前对象,也有可能是 window 对象。

对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。