call,apply,bind
大约 1 分钟
call
call
可以改变函数内部this的指向,并且会立即执行函数,第一个参数是要指定的this值,之后的参数就是函数调用时所需的参数,格式为arg1,arg2...
const obj={
name:'rice',
fun(){
console.log(this)
}
}
function fun2(x,y){
console.log(this,x,y)
return x+y
}
//obj里面的fun函数的this指向变成了window
obj.fun.call(this)
// fun2 的this指向变成了obj对象,把1和2传给函数,返回值就是原函数的返回值
const sum=fun2.call(obj,1,2)
console.log(sum) //3
apply
apply
功能和call类似,也会立即执行函数,区别就是apply的第二个参数要以数组 [arg1,arg2,...] 的形式传递
//obj里面的fun函数的this指向变成了window
obj.fun.apply(this)
// fun2 的this指向变成了obj对象,参数要以数组的形式传递
fun2.apply(obj,[1,2])
bind
bind
不会调用函数,会返回一个改变了this指向的新函数,可以手动调用该新函数
//bind 不会执行函数,会返回一个改变了this指向的新函数
const fun3=fun2.bind(this,1,2)
fun3()
相同点与区别
- 相同点
- 都可以改变函数内部this的指向;
- 区别
call 和 apply 会直接调用函数,bind不会调用函数,而是返回一个新函数;
call bind 和 apply 传递的参数格式不一样,call 和 bind 传递的参数格式为 arg1,arg2... ,apply参数格式必须是数组格式 [arg1,arg2,...];