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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

关于setTimeout函数中的this指向问题

發布時間:2024/1/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于setTimeout函数中的this指向问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么setTimeout函數的延遲執行函數中this指向window,但是延遲執行函數是箭頭函數this指向obj?

根據下面的兩點原因解釋,foo和foo2中的this都指向obj,但是其中setTimeout,它的第二個this指向應該是window,至于為什么foo2的this也指向obj,原因在于foo2中setTimeout的第一個參數是箭頭函數,箭頭函數沒有自己的this,它的this跟父級的this指向一致,都指向obj。

var obj = {name: 'name',foo: function () {console.log(this); // Object {name: "name"}setTimeout(function () {console.log(this); // Window}, 1000);},foo2: function () {console.log(this); // Object {name: "name"}setTimeout(() => {console.log(this); // Object {name: "name"}}, 2000);} }

原因在于:

setTimeout函數掛載在window對象下,《javascript高級程序設計》中寫道:“超時調用的代碼都是在全局作用域中執行的,因此函數中的this在非嚴格模式下指向window對象,在嚴格模式下是undefined。

將setTimeout調用環境下的this稱為第一個this,將延遲執行函數中的this稱為第二個this,此時有結論:

1.第一個this的指向是需要根據上下文來確定的,默認為window;2.第二個this的指向是固定的,就是指向window;

對于結論1的證明:
1.函數作為方法調用還是構造函數調用,this是不同的

function Foo() {this.value = 42;this.method = function() {// this 指向全局對象alert(this) // 輸出window 第二個thisalert(this.value); // 輸出:undefined 第二個this};setTimeout(this.method, 500); // this指向Foo的實例對象 第一個this } new Foo();

2.在外層添加一層代碼,第二個this可以訪問到window上的value

var value=33; function Foo() {this.value = 42;this.method = function() {// this 指向全局對象alert(this) // 輸出window 第二個thisalert(this.value); // 輸出:33 第二個this};setTimeout(this.method, 500); // 這里的this指向Foo的實例對象 第一個this } new Foo();

可以看出method方法中的this指向window,因為可以輸出外層value的值。
那么為什么setTimeout中的this指向的就是Foo的實例對象呢?
在setTimeout中的this是可以根據上下文而改變的。
接下來驗證一下:

function method() {alert(this.value); // 輸出 42 第二個this } function Foo() {this.value = 42;setTimeout(this.method, 500); // 這里this指向window 第一個this } Foo();

Foo()執行的時候,method方法放到外層,此時setTimeout中的this.method中的this指向window,因此可以調用到method方法。method方法中的this仍然指向window,當Foo()執行的時候,對window.value進行了賦值this.value=42,此時輸出42.

結論:

setTimeout中的第一個this的指向是根據上下文來確定的,默認指向window。

對于結論2的證明:
1.直接使用

setTimeout('console.log(this)',1); //Window

2.在一個對象中調用

var obj = {say:function(){setTimeout('console.log(this)',1);} } obj.say() //Window

3.將執行的代碼換成匿名函數

var obj = {say:function(){setTimeout(function(){console.log(this);},1);} } obj.say() //Window

4.將執行的代碼換成函數引用

function talk(){console.log(this); } var obj = {say:function(){setTimeout(talk,1);} } obj.say() //Window

結論:

setTimeout中的延遲執行函數中的this指向window;

總結

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

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

主站蜘蛛池模板: 韩国主播青草200vip视频 | 噜噜噜视频| 永久av| 欧美一区二区黄色 | 伊人77 | 日韩av无码一区二区三区 | 日韩精品网址 | 成人动漫在线观看免费 | 国产毛片毛片毛片毛片毛片毛片 | 在线看黄色av | 日本a网| 国产成人一区二区三区别 | 日韩av资源 | 可以免费看的黄色网址 | 15—16女人毛片 | 国产黄色小视频在线观看 | 久草福利免费 | 麻豆国产在线视频 | 日韩青青草| 97福利在线| av免费播放网站 | 国产精品久久久久无码av | 日日操天天操 | 日韩一级片中文字幕 | 伦理欧美 | 99在线看 | 僵尸艳谈| 激情文学欧美 | 亚洲天堂网在线观看视频 | 一级二级在线观看 | 都市乱淫 | 国产黄a三级 | 免费黄网在线观看 | www在线观看国产 | 日本电影一区 | 久久免费少妇高潮久久精品99 | 7色av| 在线观看免费人成视频 | 国产成人一区二区三区视频 | 亚洲一区二区观看 | 久草超碰在线 | 青娱乐在线免费观看 | 久久久久久免费 | 91视频最新地址 | 日本 奴役 捆绑 受虐狂xxxx | 亚洲精品久久久久久动漫器材一区 | 在线不卡一区二区 | 欧美专区一区 | 九九热精品在线 | 午夜精品网站 | 久久久久亚洲精品系列色欲 | 原来神马电影免费高清完整版动漫 | 殴美一级片| 泰国午夜理伦三级 | 亚洲免费在线看 | 日日色av | 蜜桃99视频一区二区三区 | 青娱乐国产视频 | 亚洲综合伊人久久 | 久久精品国产清自在天天线 | 青青草污| 中文字幕在线视频一区 | 91射区| 国产又粗又深又猛又爽又在线观看 | 成人免费午夜视频 | 一本大道久久a久久综合婷婷 | 中文字幕免费在线观看 | 日韩精品成人 | 日韩一区二区免费在线观看 | 日韩精品中文字幕一区二区 | 男女做的视频 | 日本视频在线观看免费 | 久草操| 999精品视频 | 交专区videossex非洲 | 精品香蕉一区二区三区 | 在线看片成人 | 精品久久久久久久久久久久久久久久久 | 欧美性猛交xxx乱大交3 | 欧美激情免费在线 | 一本毛片 | 日韩大胆视频 | 91视频网址 | jzzijzzij亚洲成熟少妇18 欧美www在线观看 | 国产91精品久久久 | 2017日日夜夜 | 艳妇臀荡乳欲伦交换在线播放 | 日本丰满熟妇hd | 欧美大片大全 | 欧美成人免费观看视频 | 91在线色| 69影院少妇在线观看 | 91久久综合亚洲鲁鲁五月天 | 青娱乐在线免费观看 | 日韩黄网 | 久色综 | 深爱激情五月婷婷 | 日韩欧美激情 | 环太平洋3:泰坦崛起 |