call和apply方法的作用與區(qū)別:
? ? ? ? ? ? (1)兩者都是改變this的指向途茫;
? ? ? ? ? ? (2)兩者傳參的形式不同:
? ? ? ? ? ? function? ? Person(name碟嘴,sex){
? ? ? ? ? ? ? ? ? ? this.name = name;
? ? ? ? ? ? ? ? ? ? this.sex = sex;
? ? ? ? ? ? }
? ? ? ? ? ? var? ? obj = {? ? };
? ? ? ? ? ? Person.call(obj,"hello","boy");? ? //obj = { name:"hello" ,sex:"boy" }
? ??????????Person.apply(obj,["hello","boy"]);? ? ?//obj = { name:"hello" ,sex:"boy" }? ? ?
? ? ? ? ? ? /*如果call和apply不傳任何參數(shù)或參數(shù)為null或undefined,那么調(diào)用該方法的函數(shù)對(duì)象中的this默認(rèn)window囊卜;兩者第一個(gè)參數(shù)是指定this的指向,其他參數(shù)是相應(yīng)要傳的值错沃,不同的是apply方法的傳參必須以數(shù)組形式傳入*/
? ? ? ? ? ? (3)call和apply方法實(shí)際上并不在函數(shù)這個(gè)實(shí)例對(duì)象上栅组,而是在Function的原型對(duì)象上
call和apply方法運(yùn)行機(jī)制:
? ? ? ? ? ? function? ? test(){
? ? ? ? ? ? ? ? ? ? console.log("函數(shù)被調(diào)用了")
? ? ? ? ? ? }
? ? ? ? ? ? test()? ? //這種形式相當(dāng)于test.call()或test.apply(),此時(shí)把test看做一個(gè)對(duì)象枢析,對(duì)象test調(diào)用方法
call和apply方法總結(jié):
bind方法:
? ? ? ? ? ? 作用是復(fù)制函數(shù)玉掸,改變函數(shù)中this的指向,有返回值醒叁,不立即執(zhí)行司浪,需要調(diào)用返回值。
call方法的特殊之處:
? ? ? ? ? ? call方法是內(nèi)置的方法把沼,我們通過(guò)一個(gè)函數(shù)定義簡(jiǎn)單了解call的實(shí)現(xiàn)原理:
? ? ? ? 從圖上可知啊易,call方法是將其執(zhí)行主體(函數(shù))中的this指向所傳的參數(shù),然后再調(diào)用執(zhí)行主體饮睬,即進(jìn)行了兩個(gè)步驟租谈。正是因?yàn)檫@個(gè)機(jī)制才有以下特殊的行為:
? ? ? ? ? ? function? ? fn1()? {? ? console.log(1)? ?}
? ? ? ? ? ? function? ? fn2()? {? ? console.log(2)? ?}
? ? ? ? ? ? fn1.call( fn2 )? ? ? ? //? ? 1
? ? ? ? ? ? fn1.call.call( fn2 )? ? //? ? 2
? ? ? ? ? ? 下圖是語(yǔ)句運(yùn)行的過(guò)程,這就是為什么輸出結(jié)果是2的原因: