任務(wù)33-this

問答

apply砰嘁、call 有什么作用,什么區(qū)別峻凫?

在介紹apply和call之前,我們先來看看this览露,
this的指向:this的指向只有函數(shù)調(diào)用的時(shí)候才能確定荧琼。

  • 在全局調(diào)用的時(shí)候指向的是window
  • 作為對(duì)象的方法調(diào)用的時(shí)候指向的是那個(gè)對(duì)象
  • 構(gòu)造函數(shù)的時(shí)候指向的是構(gòu)造出來的對(duì)象
  • 在事件的回調(diào)函數(shù)中指的是觸發(fā)事件的DOM節(jié)點(diǎn)(this===e.currentTarget)
  • 只用apply和call調(diào)用的時(shí)候指向的是第一個(gè)參數(shù)指定對(duì)象, 如果第一個(gè)null就指向window
    如:
    <pre>var name = 'hello' var obj = { name: 'world' } function printName() { console.log(this.name) } //全局調(diào)用, 默認(rèn)指向window printName()//輸出'hello' //作為obj的方法調(diào)用, 指向obj obj.printName = printName obj.printName()//輸出'world' //使用call指定this值 printName.call(obj)//輸出'world'</pre>

作用:兩者都是在指定this值和參數(shù)(參數(shù)以數(shù)組或類數(shù)組對(duì)象的形式存在)的情況下調(diào)用某個(gè)函數(shù)。實(shí)際上就是說用它可以綁定一個(gè)函數(shù)然后在另一個(gè)環(huán)境中(比如另一個(gè)函數(shù)中)使用新環(huán)境給的參數(shù)(指定this值差牛、參數(shù))進(jìn)行運(yùn)算命锄;
區(qū)別:兩者的區(qū)別在于接受的參數(shù)不同,apply接受的是數(shù)組(或者是類數(shù)組對(duì)象)偏化,call接受的是多個(gè)參數(shù)脐恩。
如:
<pre>function sum(a,b){ console.log(a+b) } function applySum(a,b){ return sum.apply(this,[a,b]) //使用apply方法,必須傳入數(shù)組 } function callSum(a,b){ return sum.call(this,a,b)//使用call方法侦讨,逐條列舉參數(shù) } applySum(3,4)//7 //雖然apply接受的是數(shù)組驶冒,但是傳遞給函數(shù)的參數(shù)還是數(shù)組中的元素苟翻,而不是整個(gè)數(shù)組 callSum(3,4)//7</pre>
由于apply接受數(shù)組類型的參數(shù),所以就有這么個(gè)特別的用法骗污。如:
<pre>var arr =[100,20,300,50] Math.min.apply(null, arr);20//就可以獲得數(shù)組中的最小值 Math.max.apply(null,arr);300//就可以獲得數(shù)組中的最大值</pre>

代碼

1. 以下代碼輸出什么?

<pre>var john = { firstName: "John" } function func() { alert(this.firstName + ": hi!") } john.sayHi = func john.sayHi()</pre>

  • 輸出 John:hi!
  • 調(diào)用對(duì)象john下sayHi方法崇猫,其this指向john

2. 下面代碼輸出什么,為什么需忿?

<pre>`
func()

function func() {
alert(this)
}
`</pre>

  • 輸出window诅炉。
  • 在全局下調(diào)用func()函數(shù),這里的this指向全局對(duì)象

3. 下面代碼輸出什么屋厘?

<pre>`
function fn0(){
function fn(){
console.log(this);
}
fn();
}
fn0();

document.addEventListener('click', function(e){
console.log(this);
setTimeout(function(){
console.log(this);
}, 200);
}, false);
`</pre>

  • fn0()執(zhí)行后輸出window涕烧,此時(shí)的fn0()是在全局環(huán)境下調(diào)用的,this指向window
  • 事件綁定后第一次輸出document 汗洒。因?yàn)樵赿ocument上綁定事件议纯,this指document。第二次輸出window仲翎。因?yàn)閟etTimeout,setInterval兩個(gè)方法的執(zhí)行上下文與調(diào)用他們的函數(shù)的執(zhí)行上下文是分離的痹扇,這兩個(gè)方法執(zhí)行的函數(shù)this也是全局對(duì)象。

4. 下面代碼輸出什么溯香,why?

<pre>var john = { firstName: "John" } function func() { alert( this.firstName ) } func.call(john)</pre>

  • 輸出John,當(dāng)函數(shù)被call方法調(diào)用時(shí)浓恶,其this指向傳入的對(duì)象玫坛,這里函數(shù)func的this就指向?qū)ο骿ohn了。

5. 代碼輸出包晰?

<pre>var john = { firstName: "John", surname: "Smith" } function func(a, b) { alert( this[a] + ' ' + this[b] ) } func.call(john, 'firstName', 'surname')</pre>

  • 輸出John Smith湿镀,func.call(context,參數(shù)1,參數(shù)2) 這里函數(shù)執(zhí)行時(shí)傳入的this是john對(duì)象

6. 以下代碼有什么問題,如何修改?

<pre>var module= { bind: function(){ $btn.on('click', function(){ console.log(this) //this指什么 this.showMsg(); }) }, showMsg: function(){ console.log('饑人谷'); } }</pre>

  • this指什么 ?當(dāng)$btn被點(diǎn)擊的時(shí)候, this指向$btn
  • this.showMsg(); 執(zhí)行時(shí)報(bào)錯(cuò)伐憾,因?yàn)檫@里的this指向的還是$btn勉痴,而$btn下沒有showMsg()這個(gè)方法,它在對(duì)象module上

修改方法:
<pre>var module= { bind: function(){ $btn.on('click', function(){ console.log(this) module.showMsg(); }) }, showMsg: function(){ console.log('饑人谷'); } }</pre>

7. 下面代碼輸出什么?

<pre>var length = 3; function fa() { console.log(this.length); } var obj = { length: 2, doSome: function (fn) { fn(); arguments[0](); } } obj.doSome(fa);</pre>

  • 輸出3,1树肃。
  • obj.doSome(fa)把fa傳進(jìn)obj的doSome方法的function(fn)內(nèi)蒸矛,并將fn賦值為fa,函數(shù)內(nèi)部的fn()變?yōu)閒a()胸嘴,由于fa函數(shù)是在window下被調(diào)用的雏掠,所以this為window,它的length為3劣像,所以這里輸3乡话。
  • 函數(shù)內(nèi)部的arguments為一個(gè)類數(shù)組對(duì)象,這里它內(nèi)部只有一個(gè)值耳奕,即處于數(shù)組0位的function fa()绑青,這里arguments0也是執(zhí)行fa()诬像,但調(diào)用的對(duì)象不同,這里調(diào)用它的是arguments闸婴,this即為arguments坏挠,由于argument只有一個(gè)值,則length為1掠拳,所以這里輸出1癞揉。

版權(quán)歸本人及饑人谷所有,轉(zhuǎn)載請(qǐng)注明出處溺欧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末喊熟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子姐刁,更是在濱河造成了極大的恐慌芥牌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聂使,死亡現(xiàn)場(chǎng)離奇詭異壁拉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柏靶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門弃理,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屎蜓,你說我怎么就攤上這事痘昌。” “怎么了炬转?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵辆苔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我扼劈,道長(zhǎng)驻啤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任荐吵,我火速辦了婚禮骑冗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捍靠。我一直安慰自己沐旨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布榨婆。 她就那樣靜靜地躺著磁携,像睡著了一般。 火紅的嫁衣襯著肌膚如雪良风。 梳的紋絲不亂的頭發(fā)上谊迄,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天闷供,我揣著相機(jī)與錄音,去河邊找鬼统诺。 笑死歪脏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粮呢。 我是一名探鬼主播婿失,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼啄寡!你這毒婦竟也來了豪硅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤挺物,失蹤者是張志新(化名)和其女友劉穎懒浮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體识藤,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砚著,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痴昧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稽穆。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赶撰,靈堂內(nèi)的尸體忽然破棺而出秧骑,到底是詐尸還是另有隱情,我是刑警寧澤扣囊,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站绒疗,受9級(jí)特大地震影響侵歇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吓蘑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一惕虑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧磨镶,春花似錦溃蔫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脐嫂,卻和暖如春统刮,著一層夾襖步出監(jiān)牢的瞬間紊遵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工侥蒙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暗膜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓鞭衩,卻偏偏與公主長(zhǎng)得像学搜,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子论衍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 問答 apply瑞佩、call 有什么作用,什么區(qū)別 apply()和call()函數(shù)都可以 指定this值和參數(shù)值的...
    ReedSun_QD閱讀 162評(píng)論 0 0
  • 問答 1. apply饲齐、call 有什么作用钉凌,什么區(qū)別 Javascript的每個(gè)Function對(duì)象中有一個(gè)ap...
    Maggie_77閱讀 272評(píng)論 0 0
  • 問答 1.apply、call 有什么作用捂人,什么區(qū)別 關(guān)鍵句:this指的是調(diào)用函數(shù)的那個(gè)對(duì)象御雕。apply,cal...
    鴻鵠飛天閱讀 241評(píng)論 0 0
  • 1.apply、call 有什么作用滥搭,什么區(qū)別 函數(shù)調(diào)用有三種形式:func(p1,p2)obj.children...
    泰格_R閱讀 279評(píng)論 0 0
  • 簡(jiǎn)答題 1.apply酸纲、call 有什么作用,什么區(qū)別 call apply瑟匆,調(diào)用一個(gè)函數(shù)闽坡,傳入函數(shù)執(zhí)行上下文及參...
    GarenWang閱讀 548評(píng)論 1 4