日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

this 的指向

發布時間:2025/6/17 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 this 的指向 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用 JavaScript 開發的時候,很多開發者多多少少會被 this 的指向搞蒙圈,但是實際上,關于 this 的指向,記住最核心的一句話:哪個對象調用函數,函數里面的this指向哪個對象。

下面分幾種情況談論下

1、普通函數調用

這個情況沒特殊意外,就是指向全局對象-window。

let username='cn' function fn(){ alert(this.username);//undefined } fn();

可能大家會困惑,為什么不是輸出守候,但是在細看一看,我聲明的方式是let,不會是window對象
如果輸出守候,要這樣寫

var username='cn' function fn(){ alert(this.username);//cn } fu(); //--------------- window.username='cn' function fn(){ alert(this.username);//cn } fn();

//可以理解為
//window.fn();


2、對象函數調用

這個相信不難理解,就是那個函數調用,this指向哪里

window.b=2222 let obj={ a:111, fn:function(){ alert(this.a);//111 alert(this.b);//undefined } } obj.fn();

很明顯,第一次就是輸出obj.a,就是111。而第二次,obj沒有b這個屬性,所以輸出undefined,因為this指向obj。

但是下面這個情況得注意

let obj1={ a:222 }; let obj2={ a:111, fn:function(){ alert(this.a); } } obj1.fn=obj2.fn; obj1.fn();//222

這個相信也不難理解,雖然obj1.fn是從obj2.fn賦值而來,但是調用函數的是obj1,所以this指向obj1。

?

3、構造函數調用

let TestClass=function(){ this.name='111'; } let subClass=new TestClass(); subClass.name='cn'; console.log(subClass.name);//cn let subClass1=new TestClass(); console.log(subClass1.name)//111

這個也是不難理解,回憶下(new的四個步驟)就差不多了!

但是有一個坑,雖然一般不會出現,但是有必要提一下。

在構造函數里面返回一個對象,會直接返回這個對象,而不是執行構造函數后創建的對象

?

apply和call調用

apply和call簡單來說就是會改變傳入函數的this。

let obj1={ a:222 }; let obj2={ a:111, fn:function(){ alert(this.a); } } obj2.fn.call(obj1);

此時雖然是 obj2 調用方法,但是使用 了call,動態的把 this 指向到 obj1。相當于這個 obj2.fn 這個執行環境是 obj1 。apply 和 call 詳細內容在下面提及。

?

5、箭頭函數調用

首先不得不說,ES6 提供了箭頭函數,增加了我們的開發效率,但是在箭頭函數里面,沒有 this ,箭頭函數里面的 this 是繼承外面的環境。

一個例子

let obj={ a:222, fn:function(){ setTimeout(function(){console.log(this.a)}) } }; obj.fn();//undefined

不難發現,雖然 fn() 里面的 this 是指向 obj ,但是,傳給 setTimeout 的是普通函數, this 指向是 window , window 下面沒有 a ,所以這里輸出?undefined。

換成箭頭函數

let obj={ a:222, fn:function(){ setTimeout(()=>{console.log(this.a)}); } }; obj.fn();//222

這次輸出 222 是因為,傳給 setTimeout 的是箭頭函數,然后箭頭函數里面沒有 this ,所以要向上層作用域查找,在這個例子上, setTimeout 的上層作用域是 fn。而 fn 里面的 this 指向 obj ,所以 setTimeout 里面的箭頭函數的 this ,指向 obj 。所以輸出 222 。

?

call和apply
call 和 apply 的作用,完全一樣,唯一的區別就是在參數上面。
call 接收的參數不固定,第一個參數是函數體內 this 的指向,第二個參數以下是依次傳入的參數。
apply接收兩個參數,第一個參數也是函數體內 this 的指向。第二個參數是一個集合對象(數組或者類數組)

let fn=function(a,b,c){ console.log(a,b,c); } let arr=[1,2,3];

如上面這個例子

let obj1={ a:222 }; let obj2={ a:111, fn:function(){ alert(this.a); } } obj2.fn.call(obj1);

call 和 apply 兩個主要用途就是

1.改變 this 的指向(把 this 從 obj2 指向到 obj1 )

2.方法借用( obj1 沒有 fn ,只是借用 obj2 方法)


原文:https://blog.csdn.net/weixin_37722222/article/details/81625826?

轉載于:https://www.cnblogs.com/f-kayden/p/10607169.html

總結

以上是生活随笔為你收集整理的this 的指向的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲免费不卡视频 | 91污在线观看 | a在线观看免费 | 精品人妻av在线 | 成年人的免费视频 | 中文天堂在线观看 | 日本少妇喷水视频 | 成人123区 | 欧美激情精品久久 | 精品国产乱码久久久久久久 | 四虎影视精品 | 在线欧美一区 | 欧美激情一区二区三区p站 欧美mv日韩mv国产网站app | 裸体毛片 | 精品自拍偷拍视频 | 西西44rtwww国产精品 | 色妞综合 | 高级家教课程在线观看 | 二三区视频 | 亚洲色图20p | 围产精品久久久久久久 | 99久热在线精品996热是什么 | 三年电影在线观看 | 黑人3p波多野结衣在线观看 | 成人做爰69片免费观看 | 黄色一级网 | 性感美女被草 | 成人免费a级片 | 人人澡澡人人 | 色免费看| 深爱激情久久 | 麻豆一区二区在线观看 | 男女日屁视频 | 色婷婷av一区二区三 | 88久久精品无码一区二区毛片 | 少妇1~3伦理 | 狠狠操在线视频 | 欧洲亚洲国产精品 | 夜夜骚av | 美国一级大黄一片免费中文 | 欧美性受xxx黑人xyx性爽 | 国产成人a人亚洲精品无码 在线aa | 中文成人无字幕乱码精品区 | 精品一区二区久久 | 91尤物在线 | 美国免费高清电影在线观看 | 日本男人天堂 | 日本91在线 | 91精品国产乱码久久 | 男女视频在线免费观看 | 欧美日韩亚洲一区二区三区 | 九九色视频 | aaaa黄色| 婷婷五月情 | 久久精品一二三区 | 亚洲免费中文 | cao在线视频 | 免费精品一区 | 色综合久久网 | 人人精品久久 | h在线免费 | 欧美日本另类 | 在线波多野结衣 | 国产精品入口麻豆九色 | av永久免费在线观看 | 草久久久久久 | 欧美日韩小视频 | 一级特黄色片 | 国产精品久久网 | 国产精品xxx视频 | 岛国午夜视频 | 色黄大色黄女片免费中国 | 国产精品国产三级国产播12软件 | 亚洲人成在线播放 | 日韩欧美视频免费在线观看 | 啪啪日韩 | 69国产精品视频免费观看 | 午夜91 | 女人18片毛片60分钟 | 高清欧美性猛交xxxx黑人猛交 | 少妇高潮喷水在线观看 | 2021狠狠干 | 精品国语对白 | 性久久久久久久久久 | 嫩草私人影院 | 日本免费电影一区二区三区 | av免费网站在线观看 | 91麻豆精品久久久久蜜臀 | 中文字幕精品视频在线 | www日本在线 | 熟妇人妻中文字幕无码老熟妇 | 好吊妞无缓冲视频观看 | 久久久久久久久久久久久女国产乱 | 森泽佳奈作品在线观看 | 久久久91视频 | 国产99久一区二区三区a片 | 欧美成人手机在线视频 | 国产伦精品一区二区三区视频黑人 | 玖玖玖精品|