昨天剛做了阿里的前端線上筆試題,其中有一道填空題如下
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");