先记住第一句话:
箭头函数不能改变this指向
只有普通函数 function(){} ,可以改变this指向
更改this指向的三个方法
函数.call(参数1, 其他一个或者多个参数)
在调用函数的同时,改变函数的this指向
参数1,是改变的this,指向的是谁
之后其他的参数,都是原始函数执行时,需要输入的实参
多个实参之间,使用逗号间隔
const obj1 = {
name:'张三',
sex:'男',
fun1:function( age , addr , phone ){
// 定义在 obj1 中的函数 fun1
// this指向的是 obj1 这个对象
// this.name 就是 obj1.name 就是 张三
// this.sex 就是 obj1.sex 就是 男
console.log(this.name , this.sex , age , addr , phone);
}
}
obj1.fun1(18 , '北京' , 123456); //张三 男 18 北京 123456
obj2 = {
name:'李四',
sex:'女',
}
obj1.fun1.call(obj2 , 20 , '上海' , 654321); //李四 女 20 上海 654321
函数.apply(参数1 , [ 一个或者多个单元的实参 ])
在调用函数的同时,改变函数的this指向
参数1,是改变的this,指向的是谁
之后的数组中,定义原始函数执行时,需要的实参
const obj1 = {
name:'张三',
sex:'男',
fun1:function( age , addr , phone ){
// 定义在 obj1 中的函数 fun1
// this指向的是 obj1 这个对象
// this.name 就是 obj1.name 就是 张三
// this.sex 就是 obj1.sex 就是 男
console.log(this.name , this.sex , age , addr , phone);
}
}
obj1.fun1(18 , '北京' , 123456); //张三 男 18 北京 123456
obj2 = {
name:'李四',
sex:'女',
}
obj1.fun1.apply(obj2 , [ 200 , '火星' , '%#^&!932903' ]); //李四 女 200 火星 %#^&!932903
函数.bind(参数)
一般会使用 变量等 存储 bind() 执行结果,也就是生成的新的函数
当期,只是在改变 ojb1中存储的函数fun1的this指向
并且生成一个新的 函数 , 函数的内存地址 存储在 newFun 变量中
此时 我们没有执行调用 fun1 只是在定义生成一个新的函数
这个新的函数,只是this指向与 fun1 不同,其他,程序,参数,等等都与 fun1 完全相同
const obj1 = {
name:'张三',
sex:'男',
fun1:function( age , addr , phone ){
// 定义在 obj1 中的函数 fun1
// this指向的是 obj1 这个对象
// this.name 就是 obj1.name 就是 张三
// this.sex 就是 obj1.sex 就是 男
console.log(this.name , this.sex , age , addr , phone);
}
}
obj1.fun1(18 , '北京' , 123456); //张三 男 18 北京 123456
obj2 = {
name:'李四',
sex:'女',
}
const newFun = obj1.fun1.bind(obj2);
newFun(500 , '不知道' , '穷,没有手机'); //李四 女 500 不知道 穷,没有手机
Comments | NOTHING