JS 函數非繼承的call和apply方法
同:call & apply 主要是用于擴展this指向,降低this作用域與函數之間的耦合度;
區別:傳參差異
function.call(this/object,params1,params2,...)
第一個參數為作用域指向參數,后邊參數如過存在多個必須分開書寫
復制代碼
function.apply(this/object,[array]/arguments)
第一個參數為作用域指向參數,后邊參數是一個素組或者參數對象
復制代碼
案列
let name="A";
let b={name:"B"}
function alertInfo(){alert(this.name);
}
alertInfo.call();//彈框 A,this默認指向windows對象
alertInfo.apply();//彈框 A,this默認指向windows對象
復制代碼
let name="A";
let b={name:"B"}
function alertInfo(age){alert(this.name+age);
}
alertInfo.call(b,20);//彈框 B 20,this此時指向b對象
alertInfo.apply(b,20);//彈框 B 20,this此時指向b對象
復制代碼
let name="A";
let b={name:"B"}
function alertInfo(age,sex){alert(this.name+age);
}
alertInfo.call(b,20,'男');//彈框 B 20 男,this此時指向b對象
alertInfo.apply(b,20,'男');//錯誤:該方法接收array或者對象
復制代碼
JS函數bind方法
該方法可用于創建一個函數實例,其this值會被bind綁定至該函數中
案列
let name="A";
let b={name:"B"}
function alertInfo(){alert(this.name);
}
let initF=alertInfo.bind();//創建的函數實例
initF();//彈框 A,this默認指向windows對象
復制代碼
let name="A";
let b={name:"B"}
function alertInfo(){alert(this.name);
}
let initF=alertInfo.bind(b);//創建的函數實例
initF();彈框 B,this此時指向b對象
復制代碼