bind楷兽、call地熄、apply的區(qū)別

所有函數(shù)都有apply和call方法,他們作用相同只是傳參形式不同

  • apply()
    apply 方法傳入兩個參數(shù):一個是作為函數(shù)上下文的對象芯杀,另外一個是作為函數(shù)參數(shù)所組成的數(shù)組端考。
var obj = {
    name : 'linxin'
}

function func(firstName, lastName){
    console.log(firstName + ' ' + this.name + ' ' + lastName);
}

func.apply(obj, ['A', 'B']);    // A linxin B

可以看到,obj 是作為函數(shù)上下文的對象瘪匿,函數(shù) func 中 this 指向了 obj 這個對象跛梗。參數(shù) A 和 B 是放在數(shù)組中傳入 func 函數(shù),分別對應 func 參數(shù)的列表元素棋弥。

  • call( )

call 方法第一個參數(shù)也是作為函數(shù)上下文的對象核偿,但是后面?zhèn)魅氲氖且粋€參數(shù)列表,而不是單個數(shù)組顽染。

var obj = {
    name: 'linxin'
}

function func(firstName, lastName) {
    console.log(firstName + ' ' + this.name + ' ' + lastName);
}

func.call(obj, 'C', 'D');       // C linxin D

對比 apply 我們可以看到區(qū)別漾岳,C 和 D 是作為單獨的參數(shù)傳給 func 函數(shù),而不是放到數(shù)組中粉寞。

對于什么時候該用什么方法尼荆,其實不用糾結(jié)。如果你的參數(shù)本來就存在一個數(shù)組中唧垦,那自然就用 apply捅儒,如果參數(shù)比較散亂相互之間沒什么關聯(lián),就用 call振亮。

  • apply和call的用法
  1. 改變 this 指向
var obj = {
    name: 'linxin'
}

function func() {
    console.log(this.name);
}

func.call(obj);       // linxin

我們知道巧还,call 方法的第一個參數(shù)是作為函數(shù)上下文的對象,這里把 obj 作為參數(shù)傳給了 func坊秸,此時函數(shù)里的 this 便指向了 obj 對象麸祷。此處 func 函數(shù)里其實相當于

function func() {
    console.log(obj.name);
}
  1. 借用別的對象的方法

先看例子

var Person1  = function () {
    this.name = 'linxin';
}
var Person2 = function () {
    this.getname = function () {
        console.log(this.name);
    }
    Person1.call(this);
}
var person = new Person2();
person.getname();       // linxin

從上面我們看到,Person2 實例化出來的對象 person 通過 getname 方法拿到了 Person1 中的 name褒搔。因為在 Person2 中阶牍,Person1.call(this) 的作用就是使用 Person1 對象代替 this 對象,那么 Person2 就有了 Person1 中的所有屬性和方法了星瘾,相當于 Person2 繼承了 Person1 的屬性和方法走孽。

  1. 調(diào)用函數(shù)

apply、call 方法都會使函數(shù)立即執(zhí)行琳状,因此它們也可以用來調(diào)用函數(shù)融求。

function func() {
    console.log('linxin');
}
func.call();            // linxin
  • bind()
  1. bind 發(fā)返回值是函數(shù)
var obj = {
    name: 'linxin'
}

function func() {
    console.log(this.name);
}

var func1 = func.bind(obj);
func1();                        // linxin

bind 方法不會立即執(zhí)行,而是返回一個改變了上下文 this 后的函數(shù)算撮。而原函數(shù) func 中的 this 并沒有被改變生宛,依舊指向全局對象 window县昂。

  1. 參數(shù)的使用
function func(a, b, c) {
    console.log(a, b, c);
}
var func1 = func.bind(null,'linxin');

func('A', 'B', 'C');            // A B C
func1('A', 'B', 'C');           // linxin A B
func1('B', 'C');                // linxin B C
func.call(null, 'linxin');      // linxin undefined undefined

call 是把第二個及以后的參數(shù)作為 func 方法的實參傳進去,而 func1 方法的實參實則是在 bind 中參數(shù)的基礎上再往后排陷舅。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倒彰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子莱睁,更是在濱河造成了極大的恐慌待讳,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仰剿,死亡現(xiàn)場離奇詭異创淡,居然都是意外死亡,警方通過查閱死者的電腦和手機南吮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門琳彩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人部凑,你說我怎么就攤上這事露乏。” “怎么了涂邀?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵瘟仿,是天一觀的道長。 經(jīng)常有香客問我比勉,道長劳较,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任浩聋,我火速辦了婚禮观蜗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赡勘。我一直安慰自己嫂便,他們只是感情好捞镰,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布闸与。 她就那樣靜靜地躺著,像睡著了一般岸售。 火紅的嫁衣襯著肌膚如雪践樱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天凸丸,我揣著相機與錄音拷邢,去河邊找鬼。 笑死屎慢,一個胖子當著我的面吹牛瞭稼,可吹牛的內(nèi)容都是我干的忽洛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼环肘,長吁一口氣:“原來是場噩夢啊……” “哼欲虚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悔雹,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤复哆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腌零,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梯找,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年益涧,在試婚紗的時候發(fā)現(xiàn)自己被綠了锈锤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡饰躲,死狀恐怖牙咏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嘹裂,我是刑警寧澤妄壶,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站寄狼,受9級特大地震影響丁寄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泊愧,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一伊磺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧删咱,春花似錦屑埋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敲街,卻和暖如春团搞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背多艇。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工逻恐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓复隆,卻偏偏與公主長得像拨匆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挽拂,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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