call apply bind

一定鸟、作用

call、apply、bind作用是改變函數(shù)執(zhí)行時的上下文伙单,簡而言之就是改變函數(shù)運(yùn)行時的this指向

那么什么情況下需要改變this的指向呢?下面舉個例子

var?name="lucy";

const?obj={

????name:"martin",

????say:function(){

????????console.log(this.name);

????}

};

obj.say();?//martin哈肖,this指向obj對象

setTimeout(obj.say,0);?//lucy吻育,this指向window對象

從上面可以看到,正常情況say方法輸出martin

但是我們把say放在setTimeout方法中淤井,在定時器中是作為回調(diào)函數(shù)來執(zhí)行的布疼,因此回到主棧執(zhí)行時是在全局執(zhí)行上下文的環(huán)境中執(zhí)行的,這時候this指向window币狠,所以輸出luck

我們實(shí)際需要的是this指向obj對象游两,這時候就需要該改變this指向了

setTimeout(obj.say.bind(obj),0);?//martin,this指向obj對象

二漩绵、區(qū)別

下面再來看看apply贱案、call、bind的使用

apply

apply接受兩個參數(shù)止吐,第一個參數(shù)是this的指向宝踪,第二個參數(shù)是函數(shù)接受的參數(shù),以數(shù)組的形式傳入

改變this指向后原函數(shù)會立即執(zhí)行碍扔,且此方法只是臨時改變this指向一次

functionfn(...args){

????console.log(this,args);

}

let?obj?=?{

????myname:"張三"

}

fn.apply(obj,[1,2]);?// this會變成傳入的obj瘩燥,傳入的參數(shù)必須是一個數(shù)組;

fn(1,2)?//?this指向window

當(dāng)?shù)谝粋€參數(shù)為null蕴忆、undefined的時候颤芬,默認(rèn)指向window(在瀏覽器中)

fn.apply(null,[1,2]);?//?this指向window

fn.apply(undefined,[1,2]);?//?this指向window

call

call方法的第一個參數(shù)也是this的指向,后面?zhèn)魅氲氖且粋€參數(shù)列表

跟apply一樣套鹅,改變this指向后原函數(shù)會立即執(zhí)行站蝠,且此方法只是臨時改變this指向一次

functionfn(...args){

????console.log(this,args);

}

let?obj?=?{

????myname:"張三"

}

fn.call(obj,1,2);?// this會變成傳入的obj,傳入的參數(shù)必須是一個數(shù)組卓鹿;

fn(1,2)?//?this指向window

同樣的菱魔,當(dāng)?shù)谝粋€參數(shù)為null、undefined的時候吟孙,默認(rèn)指向window(在瀏覽器中)

fn.call(null,[1,2]);?//?this指向window

fn.call(undefined,[1,2]);?//?this指向window

bind

bind方法和call很相似澜倦,第一參數(shù)也是this的指向,后面?zhèn)魅氲囊彩且粋€參數(shù)列表(但是這個參數(shù)列表可以分多次傳入)

改變this指向后不會立即執(zhí)行杰妓,而是返回一個永久改變this指向的函數(shù)

functionfn(...args){

????console.log(this,args);

}

let?obj?=?{

????myname:"張三"

}

const?bindFn?=?fn.bind(obj);?//?this?也會變成傳入的obj?藻治,bind不是立即執(zhí)行需要執(zhí)行一次

bindFn(1,2)?//?this指向obj

fn(1,2)?//?this指向window

小結(jié)

從上面可以看到,apply巷挥、call桩卵、bind三者的區(qū)別在于:

三者都可以改變函數(shù)的this對象指向

三者第一個參數(shù)都是this要指向的對象,如果如果沒有這個參數(shù)或參數(shù)為undefined或null,則默認(rèn)指向全局window

三者都可以傳參雏节,但是apply是數(shù)組胜嗓,而call是參數(shù)列表,且apply和call是一次性傳入?yún)?shù)钩乍,而bind可以分為多次傳入

bind是返回綁定this之后的函數(shù)辞州,apply、call?則是立即執(zhí)行

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寥粹,一起剝皮案震驚了整個濱河市变过,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌排作,老刑警劉巖牵啦,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妄痪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)楞件,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門衫生,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人土浸,你說我怎么就攤上這事罪针。” “怎么了黄伊?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵泪酱,是天一觀的道長。 經(jīng)常有香客問我还最,道長墓阀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任拓轻,我火速辦了婚禮斯撮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扶叉。我一直安慰自己勿锅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布枣氧。 她就那樣靜靜地躺著溢十,像睡著了一般。 火紅的嫁衣襯著肌膚如雪达吞。 梳的紋絲不亂的頭發(fā)上张弛,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼乌庶。 笑死种蝶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瞒大。 我是一名探鬼主播螃征,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼透敌!你這毒婦竟也來了盯滚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤酗电,失蹤者是張志新(化名)和其女友劉穎魄藕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撵术,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡背率,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嫩与。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寝姿。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖划滋,靈堂內(nèi)的尸體忽然破棺而出饵筑,到底是詐尸還是另有隱情,我是刑警寧澤处坪,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布根资,位于F島的核電站,受9級特大地震影響同窘,放射性物質(zhì)發(fā)生泄漏玄帕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一塞椎、第九天 我趴在偏房一處隱蔽的房頂上張望桨仿。 院中可真熱鬧,春花似錦案狠、人聲如沸服傍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吹零。三九已至,卻和暖如春拉庵,著一層夾襖步出監(jiān)牢的瞬間灿椅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茫蛹,地道東北人操刀。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像婴洼,于是被迫代替她去往敵國和親骨坑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容