// 改变函数的this指向
// 先记住一句话 : 箭头函数不能改变this指向
// 语法1: call() 方法
// 在调用函数时使用
// 在调用的函数名称后,添加 点 call
// 调用函数的()中,应该赋值实参
// 第一个实参是,改变的this指向对象
// 之后的参数是原始函数本身应该具有的函数实参
// 语法2: apply() 方法
// 在调用函数时使用
// 在调用的函数名称后,添加 点 apply
// 调用函数的()中,应该赋值实参
// 第一个实参是,改变的this指向对象
// 第二个参数必须是数组的形式,数组中的数据单元,是原始函数,调用是应该输入的实参
// 语法3: bind() 方法
// 生成返回一个新的函数
// 新的函数,程序等都与原始函数相同,只是this指向不同
// 定义在对象obj1中的函数fun,this指向应该是对象obj1
const obj1 = {
name:'张三',
fun:function(a,b,c,d,e){
console.log(a,b,c,d,e);
console.log(this);
}
}
const obj2 = {
name:'李四',
}
// obj1.fun('a','b','c','d','e');
// 在调用的函数名fun之后,添加 点call
// 第一个参数是obj2,表示,函数fun的this指向,改变为obj2
// 第二个参数之后,都是fun函数本身,在调用时,应该输入的实参
// obj1.fun.call(obj2,100,200,300,400,500);
// 在调用的函数名fun之后,添加 点apple
// 第一个参数是obj2,表示,函数fun的this指向,改变为obj2
// 第二个参数,以数组的形式,输入原始函数fun,执行时必须输入的实参
// obj1.fun.apply(obj2 , [100,200,300,400,500] );
// 不是在指定调用 函数 fun
// 是在生成一个新的函数,要使用变量存储新的函数,或者绑定给其他程序
// 新的函数,只是this改变,与原始函数fun,其他都一样
// fun有5个形参,新函数f 也有5个形参
// 执行时 需要输入 5个实参
// 如果,在执行bind时,没有输入实参,在调用时就必须要输入实参
// const f = obj1.fun.bind(obj2);
// f(1,2,3,4,5);
// 如果,在执行bind时,输入了实参,那么就会执行输入的实参
// 调用时再输入数据无效
const f = obj1.fun.bind(obj2 , 1,2,3,4,5);
f(100,200,300,400,500);
// 我们一般执行bind时,不会输入实参,便于灵活输入实参
// 特殊情况下会绑定实参
// 绑定函数名称时,无法输入实参
// 可以使用bind方法
// this指向不改变,还是原始函数的this指向
// 通过bind方法,绑定执行时需要的实参