关于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。
总结
1.别把this当闭包,你就想着这时候这个函数是谁调用的 2.最终执行时谁调用this就指向谁