JavaScript中apply癌蓖、call、bind的區(qū)別與用法

apply()婚肆、call()和bind()方法都是Function.prototype對象中的方法租副,而所有的函數(shù)都是Function的實例。三者都可以改變this的指向较性,將函數(shù)綁定到上下文中附井。

1. 語法

1.1 Function.prototype.apply()

apply() 方法調用一個函數(shù), 其具有一個指定的this值讨越,以及作為一個數(shù)組(或類似數(shù)組的對象)提供的參數(shù)两残。
語法
func.apply(thisArg, [argsArray])

1.2 Function.prototype.call()

call() 方法調用一個函數(shù), 其具有一個指定的this值和分別地提供的參數(shù)(參數(shù)的列表)永毅。
語法
fun.call(thisArg, arg1, arg2, ...)

1.3 Function.prototype.bind()

bind()方法創(chuàng)建一個新的函數(shù), 當被調用時,將其this關鍵字設置為提供的值人弓,在調用新函數(shù)時沼死,在任何提供之前提供一個給定的參數(shù)序列。
語法
fun.bind(thisArg, 隊列or數(shù)組)()

2. 用法

這三個方法的用法非常相似崔赌,將函數(shù)綁定到上下文中意蛀,即用來改變函數(shù)中this的指向。

2.1 普通寫法

    let me = {
        name: "me",
        sayHello: function (age) {
                console.log("hello, I am", this.name + " " + age + " " + "years old")
        }
    }
    let someone = {
            name: "someone",
    }
    me.sayHello(24) // hello, I am me 24 years old

2.2 call 與apply方法的用法

me.sayHello.apply(someone, [24]) // hello, I am someone 24 years old
me.sayHello.call(someone, 24) // hello, I am someone 24 years old

結果相同健芭,call()和apply()县钥,第一個參數(shù)都是要綁定上下文,后面的參數(shù)是要傳遞給調用該方法的函數(shù)的慈迈。不同之處在于若贮,在給調用函數(shù)傳遞參數(shù)時,apply()是數(shù)組痒留,call()參數(shù)是逐個列出的谴麦。

2.3 bind()的用法

me.sayHello.bind(someone, 24)() // hello, I am someone 24 years old
me.sayHello.bind(someone, ([24])() // hello, I am someone 24 years old

bind方法傳遞給調用函數(shù)的參數(shù)可以逐個列出,也可以寫在數(shù)組中伸头。bind方法與call匾效、apply最大的不同就是前者返回一個綁定上下文的函數(shù),而后兩者是直接執(zhí)行了函數(shù)恤磷。因此面哼,以上代碼也可以這樣寫:

me.sayHello.bind(someone)(24) // hello, I am someone 24 years old
me.sayHello.bind(someone)([24]) // hello, I am someone 24 years old

總結bind()的用法:該方法創(chuàng)建一個新函數(shù),稱為綁定函數(shù)扫步,綁定函數(shù)會以創(chuàng)建它時傳入bind()的第一個參數(shù)作為this魔策,傳入bind()的第二個以及以后的參數(shù)加上綁定函數(shù)運行時本身的參數(shù)按照順序作為原函數(shù)的參數(shù)來調用原函數(shù)。

3. 應用場景

3.1 求數(shù)組中的最大和最小值

let arr = [1,2,3,89,46]
let max = Math.max.apply(null,arr)//89
let min = Math.min.apply(null,arr)//1

3.2將類數(shù)組轉化為數(shù)組

let trueArr = Array.prototype.slice.call(arrayLike)

3.3 數(shù)組追加

let arr1 = [1,2,3]
let arr2 = [4,5,6]
let total = [].push.apply(arr1, arr2) //6
// arr1 [1, 2, 3, 4, 5, 6]
// arr2 [4,5,6]

3.4 判斷變量類型

function isArray(obj){
    return Object.prototype.toString.call(obj) == '[object Array]'
}
isArray([]) // true
isArray('dot') // false

3.5 利用call和apply做繼承

function Person(name,age){
    // 這里的this都指向實例
    this.name = name
    this.age = age
    this.sayAge = function(){
        console.log(this.age)
    }
}
function Female(){
    Person.apply(this,arguments)//將父元素所有方法在這里執(zhí)行一遍就繼承了
}
let dot = new Female('Dot',2)

3.6 使用 log 代理 console.log

function log(){
  console.log.apply(console, arguments);
}
// 當然也有更方便的 let log = console.log()

4. 總結

  • (1).三者都可以改變函數(shù)的this對象指向锌妻。
  • (2).三者第一個參數(shù)都是this要指向的對象代乃,如果如果沒有這個參數(shù),默認指向全局window仿粹。
  • (3).三者都可以傳參搁吓,但是apply是數(shù)組,而call是有順序的傳入吭历。
  • (4).bind 是返回對應函數(shù)堕仔,便于稍后調用;apply 晌区、call 則是立即執(zhí)行 摩骨。

5. 參考鏈接

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末通贞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子恼五,更是在濱河造成了極大的恐慌昌罩,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灾馒,死亡現(xiàn)場離奇詭異茎用,居然都是意外死亡,警方通過查閱死者的電腦和手機睬罗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門轨功,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人容达,你說我怎么就攤上這事古涧。” “怎么了花盐?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵羡滑,是天一觀的道長。 經(jīng)常有香客問我卒暂,道長啄栓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任也祠,我火速辦了婚禮昙楚,結果婚禮上,老公的妹妹穿的比我還像新娘诈嘿。我一直安慰自己堪旧,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布奖亚。 她就那樣靜靜地躺著淳梦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昔字。 梳的紋絲不亂的頭發(fā)上爆袍,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音作郭,去河邊找鬼陨囊。 笑死,一個胖子當著我的面吹牛夹攒,可吹牛的內(nèi)容都是我干的蜘醋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼咏尝,長吁一口氣:“原來是場噩夢啊……” “哼压语!你這毒婦竟也來了啸罢?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤胎食,失蹤者是張志新(化名)和其女友劉穎扰才,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斥季,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡训桶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酣倾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡谤专,死狀恐怖躁锡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情置侍,我是刑警寧澤映之,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蜡坊,受9級特大地震影響杠输,放射性物質發(fā)生泄漏。R本人自食惡果不足惜秕衙,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一蠢甲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧据忘,春花似錦鹦牛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汉规,卻和暖如春礼殊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背针史。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工晶伦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悟民。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓坝辫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親射亏。 傳聞我的和親對象是個殘疾皇子近忙,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

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