1. 程式人生 > 其它 >call和apply方法學習筆記

call和apply方法學習筆記

一直沒有搞清楚call()apply(),今天學習了一下

避雷:對於Array.silce.call(arguments)這種型別的呼叫,這裡不是arguments呼叫了silce,silce的呼叫者並沒有發生改變,只是silce內部的this指向了arguments

  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() 方法必須傳遞引數!!雖然這麼說,但是在非嚴格模式下不傳遞引數或者傳 null

      undefined 會自動替換指向全域性物件

    • apply()call() 基本一致,但時 apply() 接受的剩餘引數是一個數組

      apply(this,[])
      
  3. apply()call() 的區別:

    1. 按照 MDN 來說,apply 的引數是必須的,而 call() 的引數是可選的,但實際上都可以不寫。。。
    2. apply() 最多隻有兩個引數,接收剩餘引數是一個數組或者偽陣列形式;而 call() 的引數沒有限制接收剩餘引數是類似於形參的樣式
  4. apply() 的巧妙用法:某些方法提供了傳遞多個引數,但不支援傳遞陣列時,可以使用 apply() 幫我們把陣列中的元素依次傳遞到這些方法裡面,比如獲取一個數組中的最大值:

    // 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