淺談this指向
一.js中的特殊對(duì)象:

首先先看以下js中有哪些特殊的對(duì)象:
1.This對(duì)象:
本文要說的對(duì)象,比較特殊,使用環(huán)境不同,它的指向也不同。
2. window對(duì)象:
Window 對(duì)象表示瀏覽器中打開的窗口。
在客戶端瀏覽器中,window 對(duì)象是訪問 BOM 的接口,如引用 document 對(duì)象的 document 屬性,引用自身的 window 和 self 屬性等。同時(shí) window 也為客戶端 JavaScript 提供全局作用域。
Window 對(duì)象表示一個(gè)瀏覽器窗口或一個(gè)框架。在客戶端 JavaScript 中,Window對(duì)象是全局對(duì)象,所有的表達(dá)式都在當(dāng)前的環(huán)境中計(jì)算。也就是說,要引用當(dāng)前窗口根本不需要特殊的語法,可以把那個(gè)窗口的屬性作為全局變量來使用。例如,可以只寫 document,而不必寫 window.document。
3.arguments對(duì)象:
arguments 是一個(gè)對(duì)應(yīng)于傳遞給函數(shù)的參數(shù)的類數(shù)組對(duì)象。
arguments對(duì)象是所有(非箭頭)函數(shù)中都可用的局部變量。你可以使用arguments對(duì)象在函數(shù)中引用函數(shù)的參數(shù)。
二.This指向問題:
1. 事件函數(shù):
event handlers(事件處理函數(shù)),響應(yīng)于某個(gè)事件而調(diào)用的函數(shù)。像那種點(diǎn)擊事件,鍵盤事件。此時(shí)this指向這個(gè)事件元素本身。
如,有一個(gè)按鈕點(diǎn)擊事件:
我們看輸出,this與btn對(duì)應(yīng)什么,與它們是否相等:
可以看出此時(shí)this指向這個(gè)事件元素本身。
2. 全局函數(shù):
全局對(duì)象中,this默認(rèn)指向全局。
如:
運(yùn)行結(jié)果可以看出它是指向全局的:
當(dāng)然,這只是默認(rèn)情況下,如果它是被一個(gè)具名函數(shù)引用,則指向引用它的本身。
如:
可以看出此時(shí)這個(gè)this指向的是btn這個(gè)按鈕:
3.對(duì)象:
哪個(gè)對(duì)象調(diào)用了函數(shù),該函數(shù)里面的this就指向誰。
可以看出 night 函數(shù)中 this 指向 obj 這個(gè)對(duì)象 :
4.構(gòu)造函數(shù):
構(gòu)造函數(shù)中的 this, 指向了由構(gòu)造函數(shù)實(shí)例化的對(duì)象。
this指向了實(shí)例化的people對(duì)象。
5.apply和call方法:
call() 方法與apply()方法非常相似,這兩個(gè)方法都是用來改變對(duì)象的引用,能夠編寫用于不同對(duì)象的方法。不同之處在于傳遞的參數(shù)不同,參數(shù)中,第一個(gè)都是要改變的引用對(duì)象,其它多個(gè)參數(shù)一個(gè)是使用逗號(hào)分隔參數(shù)的參數(shù)列表,另一個(gè)是使用一個(gè)包含多個(gè)參數(shù)的數(shù)組。當(dāng)然如果不需要傳參數(shù)就不用了。
先看一般情況,obj2.printThis()里的 this 肯定是指向它自己里的name ‘joy’
輸出結(jié)果:
通過apply方法改變obj2對(duì)象下的printThis函數(shù)的調(diào)用,this的指向改變?yōu)閛bj:
結(jié)果:
6.箭頭函數(shù):
箭頭函數(shù)this是靜態(tài)的,this始終指向函數(shù)聲明時(shí)所在作用域下的this值:
//全局 window.name = 'night'; //對(duì)象里的 var peopel = { name:'sky' } //普通函數(shù) function getName1(){ console.log(this.name); } //箭頭函數(shù) let getName2 = ()=>{ console.log(this.name); } //分別調(diào)用 getName1.call(peopel); getName2.call(peopel);
運(yùn)行結(jié)果:
因?yàn)閏all()方法,看出getName1的this指向已經(jīng)變了,不再是全局的name,而是people對(duì)象里的name,而箭頭函數(shù)getName2沒變,因?yàn)樗冀K指向函數(shù)聲明時(shí)所在作用域下的this值。
三.總結(jié):
總的來說,this的指向不是在函數(shù)聲明時(shí)確定的,而是在調(diào)用執(zhí)行時(shí)確定的,同時(shí),this不同的指向在于遵循了一定的規(guī)則。
1.默認(rèn)情況下,指向全局,瀏覽器的話就是指向window。
2.如果函數(shù)被調(diào)用的位置存在上下文,那么函數(shù)被隱式綁定。
3.如果存在構(gòu)造函數(shù),this指向new 的這個(gè)新對(duì)象。
4.箭頭函數(shù)的是沒有屬于自己的this的,它會(huì)繼承父作用域的this,所以它是在聲明時(shí)確定的。同時(shí),它不可以new,也沒有arguments,也不能用call、bind改變。
5.call,apply能改變this的指向。
JavaScript
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。