this

apply莱睁、call 有什么作用苍碟,什么區(qū)別

要說(shuō)清除apply和call的作用就要從this的指向開(kāi)始講起

  • this值的指向
    this, 是函數(shù)內(nèi)部的屬性, 指向的函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象, 注意: this的指向只有函數(shù)調(diào)用的時(shí)候才能確定
    1. 在全局調(diào)用的時(shí)候指向的是window
    2. 作為對(duì)象的方法調(diào)用的時(shí)候指向的是那個(gè)對(duì)象
    3. 構(gòu)造函數(shù)的時(shí)候指向的是構(gòu)造出來(lái)的對(duì)象
    4. 在事件的回調(diào)函數(shù)中指的是注冊(cè)事件dom節(jié)點(diǎn)(this === e.currentTarget)
    5. 只用apply和call調(diào)用的時(shí)候指向的是第一個(gè)參數(shù)指定對(duì)象, 如果第一個(gè)null就指向window

例子:

var name = 'hello'
var obj = {
  name: 'world'
}

function sayName() {
  console.log(this.name)
}
//全局調(diào)用, 默認(rèn)指向window
sayName()//輸出'hello'
//作為obj的方法調(diào)用, 指向obj
obj.sayName = sayName
obj.sayName()//輸出'world'
//使用call指定this值
sayName.call(obj)//輸出'world'
  • apply和call的作用
    apply和call的作用是相同的, 都是指定函數(shù)的this值和參數(shù)調(diào)用函數(shù), 其實(shí)JavaScript完全可以不支持使用.調(diào)用函數(shù)的方法, 例如obj.sayName(), 這只是一個(gè)語(yǔ)法糖, 使得this的指向去不夠清晰, 而使用apply和call調(diào)用卻使this的指向十分清晰
    例如:
sayName.call(null)//如果不指定, 函數(shù)內(nèi)部的this指向的就是window
sayName.call(obj)//指定this的指向?yàn)閛bj
  • apply和call的區(qū)別
    區(qū)別在于傳遞給函數(shù)的參數(shù), apply接受的是數(shù)組形式, call接受的是多個(gè)參數(shù), 因?yàn)閍pply接受數(shù)組形式的參數(shù), 所以就有一些特別的用法, 例如
var numArr =[1,2,3,4,5,6,7]
Math.min.apply(null, numArr)//就可以獲得數(shù)組中的最小值
Math.max.apply(null,numArr)//就可以獲得數(shù)組中的最大值

注意: 雖然apply接受的是數(shù)組, 但是傳遞給函數(shù)的參數(shù)還是數(shù)組的元素, 而不是整個(gè)數(shù)組

代碼練習(xí)題

//1. 以下代碼輸出什么?
var john = {
  firstName: "John"
}
function func() {
  alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi()
//輸出"John: hi!"

//2. 下面代碼輸出什么诵冒,為什么
func()

function func() {
  alert(this)
}
//輸出window, 因?yàn)閒unc()是在全局環(huán)境下調(diào)用的, 全局環(huán)境綁定的是window對(duì)象

//3. 下面代碼輸出什么
function fn0(){
    function fn(){
        console.log(this);
    }
    fn();
}

fn0();//輸出window對(duì)象


document.addEventListener('click', function(e){
    console.log(this);//輸出dom節(jié)點(diǎn)document
    setTimeout(function(){
        console.log(this);//輸出window對(duì)象
    }, 200);
}, false);

//4. 下面代碼輸出什么碍扔,why
var john = {
  firstName: "John"
}

function func() {
  alert( this.firstName )
}
func.call(john)
//"John"
//因?yàn)閏all的第一個(gè)參數(shù)指定this的值

//5. 代碼輸出躺枕?
var john = {
  firstName: "John",
  surname: "Smith"
}

function func(a, b) {
  alert( this[a] + ' ' + this[b] )
}
func.call(john, 'firstName', 'surname')
//輸出"John Smith"

//6. 以下代碼有什么問(wèn)題歉井,如何修改
var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this) //this指什么, 當(dāng)$btn被點(diǎn)擊的時(shí)候, this指向$btn
      this.showMsg();
    })
  },

  showMsg: function(){
    console.log('饑人谷');
  }
}
//問(wèn)題: this指向只有當(dāng)函數(shù)調(diào)用是才確定, 當(dāng)$btn點(diǎn)擊的時(shí)候, this指的是$btn, 而不是module
//修改:
var module= {
  bind: function(){
    var that = this
    $btn.on('click', function(){
      console.log(that)
      that.showMsg();
    })
  },

  showMsg: function(){
    console.log('饑人谷');
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市绑莺,隨后出現(xiàn)的幾起案子暖眼,更是在濱河造成了極大的恐慌,老刑警劉巖纺裁,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诫肠,死亡現(xiàn)場(chǎng)離奇詭異司澎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)栋豫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)挤安,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人丧鸯,你說(shuō)我怎么就攤上這事蛤铜。” “怎么了丛肢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵围肥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蜂怎,道長(zhǎng)穆刻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任杠步,我火速辦了婚禮氢伟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘幽歼。我一直安慰自己朵锣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布甸私。 她就那樣靜靜地躺著诚些,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颠蕴。 梳的紋絲不亂的頭發(fā)上泣刹,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音犀被,去河邊找鬼椅您。 笑死,一個(gè)胖子當(dāng)著我的面吹牛寡键,可吹牛的內(nèi)容都是我干的掀泳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼西轩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼员舵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起藕畔,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤马僻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后注服,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體韭邓,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡措近,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了女淑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞭郑。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鸭你,靈堂內(nèi)的尸體忽然破棺而出屈张,到底是詐尸還是另有隱情,我是刑警寧澤袱巨,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布阁谆,位于F島的核電站,受9級(jí)特大地震影響瓣窄,放射性物質(zhì)發(fā)生泄漏笛厦。R本人自食惡果不足惜纳鼎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一俺夕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贱鄙,春花似錦劝贸、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瞎颗,卻和暖如春件甥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哼拔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工引有, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倦逐。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓譬正,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親檬姥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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

  • 與其他語(yǔ)言相比,函數(shù)的this關(guān)鍵字在JavaScript中的表現(xiàn)略有不同掠手,此外胎撇,在嚴(yán)格模式和非嚴(yán)格模式之間也會(huì)有...
    codingC閱讀 575評(píng)論 0 0
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持蛉谜,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券平酿,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 6,926評(píng)論 15 54
  • 特別說(shuō)明,為便于查閱俺驶,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 693評(píng)論 0 1
  • 一幸逆、this 相關(guān)問(wèn)題 知乎上關(guān)于this的解答 this 的值到底是什么?一次說(shuō)清楚 this 的工作原理在js...
    66dong66閱讀 554評(píng)論 0 0
  • 參考鏈接 this 關(guān)鍵字 深入理解上下文this 慕課視頻 基本含義 以上示例中實(shí)際都是執(zhí)行的showName方...
    day_day_up閱讀 805評(píng)論 2 3