JS中 call,apply,bind的大概區(qū)別

為什么需要這些晦墙?主要是因為this稿蹲,來看看this干的好事沧奴。

box.onclick = function(){

????????function fn(){    ? ? ? ?alert(this);? ? ? ? }

  fn();

};

我們原本以為這里面的this指向的是box,然而卻是Window邑蒋。一般我們這樣解決:

box.onclick = function(){

var _this = this;

functionfn(){    alert(_this); }

fn();

};

將this保存下來奕污。

還有一些情況萎羔,有時我們想讓偽數(shù)組也能夠調(diào)用數(shù)組的一些方法,這時call碳默、apply贾陷、bind就派上用場了。?

我們先來解決第一個問題修復this指向嘱根。

box.onclick = function(){

 function fn(){    console.log(this);}

????fn.call(this);

};

很神奇吧髓废,call的作用就是改變this的指向的,第一個傳的是一個對象该抒,就是你要借用的那個對象慌洪。

fn.call(this);?

  這里的意思是讓this去調(diào)用fn這個函數(shù),這里的this是box凑保,這個沒有意見吧冈爹?如果這個你不清楚,很可能你是javscript的新朋友欧引。box調(diào)用fn频伤,這句話非常重要,我們知道this它始終指向一個對象芝此,剛好box就是一個對象憋肖。那么fn里面的this就是box因痛。

這句話在某些情況下是可以簡寫的,比如:

box.onclick = function(){

var fn = function(){   console.log(this); //box  }.call(this);

};

或者這樣:

box.onclick = function(){

 (function(){

 console.log(this);

  }.call(this)); //box};

又或者這樣:

var objName = {name:'JS2016'};

var obj = {

  name:'0 _ 0',

  sayHello:function(){

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

  }.bind(objName)

};

obj.sayHello();//JS2016

call和apply瞬哼、bind都是用來改變this的指向的婚肆,但也有一些小小的差別。下面我們來看看它們的差別在哪

function fn(a,b,c,d){

  console.log(a,b,c,d);

}

//call

fn.call(null,1,2,3);

//apply

fn.apply(null,[1,2,3]);

//bind

var f = fn.bind(null,1,2,3);

f(4);

結果如下:1 2 3 undefined1 2 3 undefined1 2 3 4

前面說過第一個參數(shù)傳的是一個你要借用的對象坐慰,但這么我們不需要较性,所有就傳了一個null,當然你也可以傳其他的结胀,反正在這里沒有用到赞咙,除了第一個參數(shù)后面的參數(shù)將作為實際參數(shù)傳入到函數(shù)中。

call就是挨個傳值糟港,apply傳一個數(shù)組攀操,bind也是挨個傳值,但和call和apply還有一些不同秸抚,使用call和apply會直接執(zhí)行這個函數(shù)速和,而bind并不直接執(zhí)行,而是將綁定好的this重新返回一個新函數(shù)剥汤,什么時候調(diào)用由你自己決定颠放。

var objName = {name:'JS2016'};var obj = {

  name:'0 _ 0',

  sayHello:????function(){

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

  }.bind(objName)

};

obj.sayHello();//JS2016

這里也就是為什么我要用bind的原因,如果用call的話就會報錯了吭敢。自己想想這個sayHello在obj都已經(jīng)執(zhí)行完了碰凶,就根本沒有sayHello這個函數(shù)了。

這幾個方法使用的好的話可以幫你解決不少問題比如:?

正常情況下Math.max只能這樣用

Math.max(10,6)

但如果你想傳一個數(shù)組的話你可以用apply

var arr = [1,2,30,4,5];

console.log(Math.max.apply(null,arr));

又或者你想讓偽數(shù)組調(diào)用數(shù)組的方法

function fn(){

  [].push.call(arguments,3);

  console.log(arguments); //[1, 2, 3]

}

fn(1,2);

再者:

var arr = ['aaabc'];

console.log(''.indexOf.call(arr,'b')); //3

實際上瀏覽器內(nèi)部根本就不在乎你是誰鹿驼,它只關心你傳給我的是不是我能夠運行的欲低,如下:?

正常情況

var str = 'aaabc';

console.log(str.indexOf('b'));

而這種情況其實做的事情和上面一模一樣,看我來拆解畜晰。

var arr = ['aaabc'];

' '.indexOf.call(arr);

這句話就是說讓arr調(diào)用字符串的indexOf方法砾莱,前面說過了瀏覽器內(nèi)部不在乎你是誰,所以誰都可以來調(diào)用凄鼻,但不是100%成功恤磷,具體看如下。

''.indexOf.call(arr,'b')

這里的arr就是[‘a(chǎn)aabc’]野宜,內(nèi)部很可能拆成了’aaabc’扫步,因此就成了下面的這段代碼。

'aaabc'.indexOf('b');


鏈接:http://blog.csdn.net/lizeshi125/article/details/53670590

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匈子,一起剝皮案震驚了整個濱河市河胎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌虎敦,老刑警劉巖游岳,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件政敢,死亡現(xiàn)場離奇詭異,居然都是意外死亡胚迫,警方通過查閱死者的電腦和手機喷户,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來访锻,“玉大人褪尝,你說我怎么就攤上這事∑谌” “怎么了河哑?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長龟虎。 經(jīng)常有香客問我璃谨,道長,這世上最難降的妖魔是什么鲤妥? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任佳吞,我火速辦了婚禮,結果婚禮上棉安,老公的妹妹穿的比我還像新娘底扳。我一直安慰自己,他們只是感情好垂券,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著羡滑,像睡著了一般菇爪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柒昏,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天凳宙,我揣著相機與錄音,去河邊找鬼职祷。 笑死氏涩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的有梆。 我是一名探鬼主播是尖,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泥耀!你這毒婦竟也來了饺汹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤痰催,失蹤者是張志新(化名)和其女友劉穎兜辞,沒想到半個月后迎瞧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡逸吵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年凶硅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扫皱。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡足绅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啸罢,到底是詐尸還是另有隱情编检,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布扰才,位于F島的核電站允懂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏衩匣。R本人自食惡果不足惜蕾总,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琅捏。 院中可真熱鬧生百,春花似錦、人聲如沸柄延。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搜吧。三九已至市俊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滤奈,已是汗流浹背摆昧。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜒程,地道東北人绅你。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像昭躺,于是被迫代替她去往敵國和親忌锯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

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