淺談JavaScript中的apply喘先、call钳吟、bind

apply,call,bine 這三兄弟經(jīng)常讓初學(xué)者感到疑惑。前兩天準(zhǔn)備面試時特地做了個比較窘拯,其實(shí)理解起來也不會太難红且。

apply

MDN上的定義:
The apply() method calls a function with a given this value and arguments provided as an array (or an array-like object).

apply() 方法調(diào)用一個函數(shù),指定該函數(shù)的 this 值并將一個數(shù)組(或類數(shù)組對象)作為該函數(shù)的參數(shù)涤姊。

語法 (Syntax)

fun.apply(thisArg,[argsArray])

直接上代碼

function sayColor(arg) {
    var color = "red";
    console.log(arg + this.color);
}
var obj = {color: "blue"};
sayColor.apply(obj, ["The color is"]); //輸出"The color is blue"

此時 this 指向 obj 暇番,則 this.colorobjcolor 屬性,則輸出 The color is blue思喊。

call

call()apply() 類似壁酬,區(qū)別在于 apply() 的第二個參數(shù)為數(shù)組,而 call() 把參數(shù)跟在第一個參數(shù)后面恨课,并且可以跟多個參數(shù)舆乔。

語法 (Syntax)

fun.call(thisArg, arg1, arg2, arg3 ...)

看代碼

function sayClothe(arg1,arg2) {
    console.log(arg1 + this.color + arg2);
}
var obj = {color: "blue"};
sayClothe.call(obj, "This is a ", " clothe" ); //輸出"This is a blue clothe"

bind

bind()call() 類似,有一點(diǎn)不同在于 bind() 返回一個新函數(shù)(new function)剂公,我們可以隨時調(diào)用該函數(shù)希俩。

語法(Syntax)

fun.bind(thisArg, arg1, arg2, arg3 ...)

返回值

返回一個具有指定 this 和初始參數(shù)的函數(shù)副本。

看代碼

function sayClothe(arg1, arg2) {
    console.log(arg1 + this.color + arg2);
}
var obj = {color: "blue"};
var sayClothe2 = sayClothe.bind(obj, "This is a ", " clothe");
sayClothe2(); //輸出 "This is a blue clothe"

使用

有時候我們會碰到 Array.prototype.slice.call(arguments) 這種用法纲辽。許多人會疑惑颜武,直接使用 arguments.slice() 不就行了嗎璃搜,為什么要多此一舉。

原因在于盒刚,arguments 并不是真正的數(shù)組對象腺劣,只是 array-like object ,所以它并沒有 slice 這個方法因块。而 Array.prototype.slice.call(arguments) 可以理解為把 slice 的對象指向 arguments ,從而讓 arguments 可以使用 slice 方法橘原。如果直接使用 arguments.slice() 則會報錯。

bind() 的另一個用法則是讓函數(shù)擁有預(yù)設(shè)參數(shù)涡上,而又跟預(yù)設(shè)參數(shù)有所不同趾断。

以下例子結(jié)合上面兩條規(guī)則 本例出自MDN

function list() {
    return Array.prototype.slice.call(arguments);
}

var list1 = list(1, 2, 3); //[1, 2, 3]

//Create a function with a preset leading arguments
var leadingThirtysevenList = list.bind(null, 37);

var list2 = leadingThirtysevenList();
//[37]

var list3 = leadingThirtysevenList(1, 2, 3);
//[37, 1, 2, 3]

我們想到預(yù)設(shè)參數(shù)就會理所當(dāng)然的想到 “如果該函數(shù)沒有參數(shù)就使用預(yù)設(shè)參數(shù),有參數(shù)就使用提供的參數(shù)”吩愧。不過 bind() 所提供的預(yù)設(shè)參數(shù)功能與此不同芋酌。

在我們的印象中, list3 應(yīng)該輸出 [1, 2, 3] 但實(shí)際輸出的卻是 [37, 1, 2, 3]雁佳。因?yàn)?bind() 的特點(diǎn)脐帝,leadingThirtysevenList(1, 2, 3) 可以寫為 list.bind(null, 37, 1, 2, 3)

總結(jié)

apply() call() bind() 三者區(qū)別不大糖权,都是用來改變函數(shù)的 this 指向堵腹。

apply()this 所需參數(shù)放入一個數(shù)組,作為 apply() 的第二個參數(shù)傳入星澳。當(dāng)參數(shù)不定時疚顷,我們可以傳入 argumentscall()bind() 則把參數(shù)按順序依次傳入禁偎。

bind() 返回對應(yīng)函數(shù)腿堤,便于稍后調(diào)用,而 apply()如暖、call()則立即調(diào)用

由于其特性笆檀,使用起來千奇百怪,有各種各樣有趣的用法装处,還等待我們?nèi)ネ诰颉?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末误债,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子妄迁,更是在濱河造成了極大的恐慌寝蹈,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件登淘,死亡現(xiàn)場離奇詭異箫老,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)黔州,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門耍鬓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阔籽,“玉大人,你說我怎么就攤上這事牲蜀“手疲” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵涣达,是天一觀的道長在辆。 經(jīng)常有香客問我,道長度苔,這世上最難降的妖魔是什么匆篓? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮寇窑,結(jié)果婚禮上鸦概,老公的妹妹穿的比我還像新娘。我一直安慰自己甩骏,他們只是感情好窗市,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饮笛,像睡著了一般谨设。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缎浇,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天,我揣著相機(jī)與錄音赴肚,去河邊找鬼素跺。 笑死,一個胖子當(dāng)著我的面吹牛誉券,可吹牛的內(nèi)容都是我干的指厌。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼踊跟,長吁一口氣:“原來是場噩夢啊……” “哼踩验!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起商玫,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤箕憾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拳昌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袭异,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年炬藤,在試婚紗的時候發(fā)現(xiàn)自己被綠了御铃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碴里。...
    茶點(diǎn)故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖上真,靈堂內(nèi)的尸體忽然破棺而出咬腋,到底是詐尸還是另有隱情,我是刑警寧澤睡互,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布根竿,位于F島的核電站,受9級特大地震影響湃缎,放射性物質(zhì)發(fā)生泄漏犀填。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一嗓违、第九天 我趴在偏房一處隱蔽的房頂上張望九巡。 院中可真熱鬧,春花似錦蹂季、人聲如沸冕广。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撒汉。三九已至,卻和暖如春涕滋,著一層夾襖步出監(jiān)牢的瞬間睬辐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工宾肺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溯饵,地道東北人。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓锨用,卻偏偏與公主長得像丰刊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子增拥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評論 2 350

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