淺談this指向

      網(wǎng)友投稿 785 2025-04-04

      一.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é)果:

      淺談this指向

      因?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)容。

      上一篇:表格操作(電腦表格操作)
      下一篇:wps表格怎樣篩選格式(wps表格怎么用篩選)
      相關(guān)文章
      亚洲欧美在线x视频| 亚洲一卡2卡3卡4卡国产网站| 91亚洲视频在线观看| 亚洲av日韩av天堂影片精品| 亚洲欧洲中文日韩av乱码| 亚洲成av人片天堂网无码】| 亚洲中文无码亚洲人成影院| 亚洲一卡二卡三卡| 亚洲一区二区三区久久久久| 久久亚洲国产精品一区二区| 亚洲av无码国产精品色在线看不卡 | 亚洲av片劲爆在线观看| 好看的电影网站亚洲一区| 国产AⅤ无码专区亚洲AV| 中文字幕精品无码亚洲字| 亚洲精品线路一在线观看| 亚洲男人在线无码视频| 亚洲国产一级在线观看| 亚洲国产精品不卡毛片a在线| 高清在线亚洲精品国产二区| 国产亚洲视频在线播放大全| www亚洲精品久久久乳| 国产精品久久亚洲一区二区| 四虎精品亚洲一区二区三区| 亚洲福利精品一区二区三区| 亚洲综合另类小说色区色噜噜| 国产精品亚洲美女久久久| 亚洲中文字幕久久精品无码喷水 | 国产亚洲精品激情都市| 国产亚洲大尺度无码无码专线 | 亚洲区小说区激情区图片区| 久久被窝电影亚洲爽爽爽| 亚洲AV无码成人网站久久精品大 | 亚洲国产精品成人AV在线| 亚洲av无码片vr一区二区三区| 国产成人亚洲毛片| 久久精品国产亚洲一区二区三区| 日本亚洲国产一区二区三区| 久久久久久久综合日本亚洲| 久久亚洲国产精品成人AV秋霞| 亚洲午夜久久久精品电影院|