this到底是什么?
函数被调用时的位置(是动态的!)
(箭头函数不在此范围,因为它的this是函数定义时的上下文,是静态的!)
判断规则
1.如果是在new中调用,this则为新创建的对象
2.通过call,apply调用,this是之前定的对象(第一个参数)
(注意 若第一个参数是null,undefined则执行第四条判断规则)
3.在么某个上下文中调用,this是该上下文对象
4.上面3个都不是的话,this是全局对象(严格模式是undefined)
速记
1.new(该函数使用new构造调用了)
2.显式(该函数显示使用call,apply调用)
3.隐式(该函数为某个对象的属性值,作为对象的属性方法调用)
4.默认(无特征,直接调用了)
加深理解
看代码吧~
new绑定
function foo(a){
this.a = a;
}
var bar = new foo(2);
console.log(bar.a); // 2
显式绑定
function foo(a){
this.a = a;
}
var obj = {a:2};
foo.call(obj); // 2
隐式绑定
function foo(){
console.log(this.a);
}
var obj = {
a: 2,
foo: foo
};
console.log(obj.foo); // 2
// trap 2or22???
function foo(){
console.log(this.a);
}
var obj1 = {
a: 2,
foo: foo
};
var obj2 = {
a: 22,
obj1: obj1
};
obj2.obj1.foo(); // tip 函数foo是谁的属性值呢?
绑定默认
function foo(){
console.log(this.a);
}
var a = 2;
foo(); // 2
常规考点~
// trap 0or1??? why? 如何打印另外一个值~
function foo(){
setTimeout(function(){
console.log(this.a);
},1000);
}
var obj = {a:1};
var a = 0;
foo.call(obj); // tip 包含this的函数究竟是在哪里被执行的呢?0和1的区别在于?