JavaScript中的call()和apply()

林堯彬發表於2020-04-04

昨天剛做了阿里的前端線上筆試題,其中有一道填空題如下

function func(){
  alert(this.valueOf());  
}

func._________;
//期望結果是abc

一開始看到這個題,就想到了call()和apply()方法,但無奈對這兩個方法的的用法只是有個模糊的記憶。

於是,就針對這道題,自己對call()和apply()的用法進行了進一步的資料查閱和理解,在此記錄一下以便加深印象,也便於以後查詢。

作用:

在特定的作用域中呼叫函式。也就是設定函式體內this物件的值。

用法:

call()和apply()都接受兩個引數:一個是在其中執行函式的作用域,另一個是傳遞的引數。

兩者的主要區別在於:接收引數的方式不同。其中call()在接收引數時,引數必須一一列出;而apply()接收的引數必須是引數陣列,可以是Array的例項,也可以是arguments物件。例如:

function sum(num1,num2){
    return num1+num2;
}    

function applySum1(num1,num2){
    return sum.apply(this,arguments); //傳入arguments物件      
}

function applySum2(num1,num2){
    return sum.apply(this,[num1,num2]);  //傳入陣列
}

function callSum(num1,num2){
    return sum.call(this,num1,num2);  //傳入引數一一列出
}

至於是使用call()還是apply(),完全取決於你採取哪種給函式傳遞引數的方式最方便。

所以一開始提到的填空題的答案也不唯一,這裡就給出以下兩種:

func.call("abc");
func.apply("abc");

 

轉載於:https://www.cnblogs.com/huangyx/p/4742296.html

相關文章