//A.func.call(B,x,y) 用B对象调用A对象的func方法并传入x,y进func中后立即执行
//用B对象调用A对象的func方法可以简单理解为在B的环境中执行func方法>> B.func(x,y)
//A.func.apply(B,[x,y]) 和call一样只不过传入调用函数的参数要求是数组
//A.func.bind(B,x,y) bind返回的是一个绑定完this的函数
let obj = {
name: 'hello',
func: function(m,n){
console.log(this.name,'m:',m,'n',n)
}
};
let obj2 = {
name: 'world'
};
let obj3 = {
name: '我是a',
b: {
name: '我是b',
f: function(){
console.log(this.name);
}
}
};
obj.func(1,2); //hello m: 1 n: 2
obj.func.call(obj2,3,4); //world m: 3 n: 4
obj.func.call(obj2,[3,4]); //world m: [3, 4] n: undefined
obj.func.apply(obj2,[3,4]); //world m: 3 n: 4
obj.func.apply(obj2,3,4); //报错
let t = obj.func.bind(obj2,1,2);
t();//world m: 1 n: 2
//this的指向在函数定义的时候是确定不了的,
//实际上this的最终指向的是那个调用它的对象,例如 A.B.func() this指向的是B环境
obj3.b.f(); //我是b
//bind可以类比这个简单理解,因为已经绑定了所以返回的是B.func
//在别的地方调用比如window就是window.B.func()
//再比如经典的题型 obj.f.bind(A).bind(B).bind(c)
//可以简单看成C.B.A.f最终this指向的是最先绑定的A