call的用法
call方法的第一个参数是this的指向,后面传入的是一个参数列表(注意和apply传参的区别)。当一个参数为null或undefined的时候,表示指向window(在浏览器中),和apply一样,call也只是临时改变一次this指向,并 立即执行。
const arr=[1,10,5,8,3];
console.log(Math.max.call(null,arr[0],arr[1],arr[2],arr[3],arr[4])); //10
bind方法
bind方法和call很相似,第一参数也是this的指向,后面传入的也是一个参数列表(但是这个参数列表可以分多次传入,call则必须一次性传入所有参数),但是它改变this指向后不会立即执行,而是返回一个永久改变this指向的函数。
const arr=[1,10,5,8,12];
const max=Math.max.bind(null,arr[0],arr[1],arr[2],arr[3])
console.log(max(arr[4])); //12,分两次传参
apply方法
apply接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传入,且当第一个参数为null、undefined的时候,默认指向window(在浏览器中),使用apply方法改变this指向后原函数会立即执行,且此方法只是临时改变thi指向一次。
window.name = "小王"
const obj = {
name:"张三",
age: 23,
getInfo(){
console.log(this)
console.log(this.name)
}
}
obj.getInfo.apply(null, []) // 小王
obj.getInfo.apply(obj, []) // 张三
call、apply、bind 三者的区别
- 都可以修改函数的
this指向, ,如果如果没有这个参数或参数为undefined或null,则默认指向全局window。 - 都可以传参,但是
apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind可以分为多次传入 bind是返回绑定this之后的新函数,便于稍后调用;apply、call则是立即执行call的性能比apply稍微好点, 因为当传入的参数超过三个 以上的时候,apply的第二个参数是数组,函数在执行时,解析数组获取参数,需要耗费性能