call、apply、bind 的用法分别是什么?以及区别

198 阅读2分钟

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 指向, ,如果如果没有这个参数或参数为undefinednull,则默认指向全局window
  • 都可以传参,但是apply是数组,而call是参数列表,且applycall是一次性传入参数,而bind可以分为多次传入
  • bind 是返回绑定this之后的新函数,便于稍后调用;applycall 则是立即执行
  • call的性能比 apply 稍微好点, 因为当传入的参数超过三个 以上的时候, apply 的第二个参数是数组,函数在执行时,解析数组获取参数,需要耗费性能