91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

淺談js中的this問題

發布時間:2020-09-20 22:04:18 來源:腳本之家 閱讀:173 作者:快樂的~小和尚 欄目:web開發

this

this的指向在函數定義的時候是確定不了的,只有函數執行的時候才能確定this到底指向誰,實際上

this的最終指向的是那個調用它的對象(這里其實并不完全對,this的指向有時候會很微妙,得靠自己去慢慢體會)

只有方法在對象上,對象調用當前方法,指向當前對象

function fnThis(){
 let user='js';
 console.log(this.user)//undefined
 console.log(this)//global(window)
}

fnThis();

這里為什么會輸出一個全局的對象?因為我們申明的函數,在全局里,現在執行這個函數

實際上是全局在調用

let obj={
 user:'js',
 fn:function(){
 console.log(this.user)
 }
obj.fn();

這里是obj在調用,所以指向我們的obj,這并不能說明,我們一開始就說的this最終調用他的那個

對象

let obj={
 user:'js',
 objTwo:{
 user:'css',
 fn:function(){
  console.log(this.user)
 }
 }
}

obj.objTwo.fn();

這里只是指向了obj2,而并沒有指向最終調用它的obj.

來個料咋們看看this這家伙

<button id="myBtn" value="按鈕">按鈕</button>
<script>

let myBtn=document.querySelector("#myBtn")
let fn=function(){
  console.log(this);
}
myBtn.onclick=function(){
  fn();//輸出的全局
  console.log(this);//輸出的是這個button
}
</script>

這里從表面看,會認為第一個輸出的是這個btn按鈕,不是說誰調用指向誰么,但是咋們仔細看這個是btn在調用么???

其實是這個點擊事件的匿名函數在調用,而這fn()本身是全局上下文的函數,它的this指向的是全局,它是作為這個匿名函數的普通函數,自然指向的全局

我們如果這樣寫

myBtn.onclick=fn;//btn點擊的時候就指向這個btn了,這時候輸出結果為這個button,

總結

1. 全局上下文,或者普通函數上下文里面的this,包括函數里面的普通函數,都是指向全局
2. 在對象方法里面的this指向該對象
3. 在事件方法里面的this指向發生事件的這個對象

特殊情況

let obj={
 user:'js',
 objTwo:{
 user:'css',
 fn:function(){
  console.log(this.user)
  console.log(this)
 }
 }
}

let objThre=obj.objTwo.fn;

objThree();

把函數賦值給了objThree,而objThree是在全局上,所以輸出的是全局

補充

let chinesePeople=function(){
 this.name='張飛';
 return obj
 }

如果返回的是對象,this就指向返回的那個對象,否則就指向實例對象

改變的幾種方式

let obj={a:80}
let objTwo={
 a:70,
 fn:function(){
  console.log(this.a);
 }
}

objTwo.fn.call(obj);
調用一個方法,并改變其this指向

objTwo.fn.apply(obj);
調用一個方法,并改變其this指向

前2者區別,在于后面的參數,一個是順序,一個是數組

objTwo.fn.bind(obj)();

bind()方法會創建一個新函數,在綁定后,我們可以加括號立即執行,也可以等需要執行再執行

第一個參數對象,以后的順序傳參

new方法,其實是隱藏的調用了一個call的方法

以上這篇淺談js中的this問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

瓦房店市| 金堂县| 固安县| 临漳县| 太仆寺旗| 东台市| 樟树市| 芜湖市| 承德市| 大渡口区| 青田县| 甘谷县| 黄梅县| 辽宁省| 盐亭县| 太原市| 莆田市| 亚东县| 安泽县| 密山市| 安吉县| 萝北县| 天柱县| 当雄县| 瓮安县| 贞丰县| 岚皋县| 兴义市| 修文县| 开平市| 阜阳市| 阜宁县| 航空| 会理县| 华安县| 明溪县| 伊吾县| 潢川县| 昌邑市| 凤山市| 德兴市|