call和apply方法学习笔记


一直没有搞清楚call()apply(),今天学习了一下

call()和apply()可以将任意函数作为指定对象的方法调用!!!

  1. call()

    • 使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。

    • 使用 call() 只是改变了 this 的指向,方法的调用者没有改变

      // 在这个方法里,slice内部的this指向了arguments,而slice的调用者仍然是Array
      Array.prototype.slice().call(arguments)
      
    • call() 方法可以不传递参数(非严格模式),在非严格模式下不传参的 call() 方法会指定 this 为全局对象,同样的还有 this 指定为 nullundefined 。严格模式下不传参和传递 null 或者 undefined 会报错

    • call() 方法传递的第一个参数为指定的 this ,剩余的参数是要给函数传递的参数

      call(this,arg1,arg2,arg3,...)
      
  2. apply()

    • 方法调用一个具有给定this值的函数,以及以一个数组(或类数组对象)的形式提供的参数。

    • apply() 方法必须传递参数!!虽然这么说,但是在非严格模式下不传递参数或者传 nullundefined 会自动替换指向全局对象

    • apply()call() 基本一致,但时 apply() 接受的剩余参数是一个数组

      apply(this,[])
      
  3. apply()call() 的区别:

    1. 按照 MDN 来说,apply 的参数是必须的,而 call() 的参数是可选的,但实际上都可以不写。。。
    2. apply() 最多只有两个参数,接收剩余参数是一个数组或者伪数组形式;而 call() 的参数没有限制接收剩余参数是类似于形参的样式
  4. apply() 的巧妙用法:某些方法提供了传递多个参数,但不支持传递数组时,可以使用 apply() 帮我们把数组中的元素依次传递到这些方法里面(与ES6中的扩展运算符类似),比如获取一个数组中的最大值:

    // Math.max() 不支持传入数组,只支持Math.max(num1,num2,...)这种类型的传参
    // 可以利用apply()方法获得一个数组中的最大值
    const arr = [1,2,400,4,5]
    let result = Math.max.apply(null,arr)
    console.log(result) // 400
    
js