共同点:改变函数内部运行时this的指向
不同点:
1) apply和call改变this指向原函数会立马执行,临时改变this指向一次。
bind 改变this指向不会立马执行,返回一个永久改变this指向的函数。
2)apply 传参为数组, call 传参为列表形式用逗号隔开
场景一般用法 :
call :经常用于做继承
apply:一般跟数组有关,求最大最小值
function MaxAndMin (arr) {
return [Math.min.apply(null, arr), Math.max.apply(null, arr)]
}
let arr = [8,5,4,7,1,3,3,6]
console.log(MaxAndMin(arr)) // [1,8]
bind:一般改变定时器this内部执行
var age = 18;
var obj = {
age:20,
talk:function(){
console.log(this.age)
}
}
obj.talk() //20 --
setTimeout(obj.talk,0) // 18 --指向window
setTimeout(obj.talk.bind(obj),0)//让obj.talk方法指向 obj(改变了this指向), 结果20
1)apply: 两个参数,第一个是this指向,第二个是函数接受的参数(数组形式传入)
function fun(...args){
console.log(this)
console.log(...args)
}
var person={
name : '张三'
}
//{name: '张三'} 使用apply指向了person
fun.apply(person,[10,20,30,40])//apply 第二个参数是数组
//指向window
fun(1,2,3,4)
//如果第一个参数是null或undefined 默认指向window
fun.apply(null,[1])
fun.apply(undefined,[1])
2) call 两个参数,第一个是this指向,第二个是参数列表(和apply不同之处)
fun.call(person,1,2,3,4)
fun(1,2,3,4)
3) bind: 两个参数,第一个是this指向,第二个是参数列表(和call相似)
bind 改变this指向不会立马执行,返回一个永久改变this指向的函数。
fun.bind(person) //没有任何打印--不会立马执行
var bindFun = fun.bind(person)
bindFun(); //{name: '张三'} //通过执行函数才执行
bindFun(1,2,3,4); //也可以传参