关于this的指向问题总结

642 阅读1分钟

关于this的知识点:

1.this 的指向,是在执行上下文的创建过程中,被确定的。(,只有在函数调用时,this 的指向才会被确定。)

2.在一个函数的执行上下文中,this 由该函数的调用者「caller」提供,由调用函数的方式来决定。方式一,有明确的调用者(可以手动)。方式二,独立调用,无明确的调用者。方式三:箭头函数

由两道题目引发的this指向问题

题目一

var a = 20;
var foo = {
a: 10,
getA: function () {
   return this.a;
 }
}
console.log(foo.getA()); // 此处值为?10 

var test = foo.getA;
console.log(test()); // 此处值为?20   

题目二

function foo() {
  console.log(this.a)
}

function active(fn) {
   fn();
}

var a = 20;
var obj = {
   a: 10,
   getA: foo,
   active: active
}

active(obj.getA); // 输出的值是多少? 20
obj.active(obj.getA); // 输出的值是多少? 20

分析:

题目1:getA是callee(被调用者),foo是caller(调用者),getA的this指向foo 所以this.a 是10 test()是独立调用,所以this指向window

题目2: 第一处打印active无调用者,直接调用foo(),所以指向window。

此处最具有迷惑性的一点就是 obj.active(obj.getA); // 输出的值是多少? 20

这里为什么会是20呢?为什么不是10!为什么!为什么!为什么! obj.getA是函数active的实参 fn()是执行,此处相当于执行foo(),没有调用者,所以指向window。

20e1a9f1280ad985e86373ffdb13b62.png

总结

1.别把this当闭包,你就想着这时候这个函数是谁调用的 2.最终执行时谁调用this就指向谁