日韩性视频-久久久蜜桃-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指向问题的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 免费的黄色av | 国产精品成人一区二区三区电影毛片 | 青青青青青草 | 91大片在线观看 | 熟女毛毛多熟妇人妻aⅴ在线毛片 | 可以免费观看av的网站 | 中文字幕av亚洲精品一部二部 | 久久我不卡 | 影音先锋国产资源 | 免费a大片 | av资源站最新av | 制服丝袜先锋影音 | 国产拍拍拍 | 欧美mv日韩mv国产网站 | 久久久精品久久久 | 免费成人深夜夜行网站视频 | 一本之道高清无码视频 | 国产精品调教视频 | 亚洲成人xxx | 欧美黄色大片视频 | 久草免费在线视频观看 | 久久国产精品影视 | 91精品一区二区三 | 蜜臀人妻四季av一区二区不卡 | 欧美精品99久久久 | 精品视频久久久 | 成人免费看片视频 | 国产欧美一区二区三区视频在线观看 | 住在隔壁的她动漫免费观看全集下载 | 牛人盗摄一区二区三区视频 | 中文字幕视频免费 | 久草在在线视频 | 日韩精品一区二区亚洲av性色 | 亚洲25p| 国产精在线 | 欧美日韩aaa | 2021中文字幕| 狠狠v欧美v日韩v亚洲ⅴ | 亚洲三级黄色 | 午夜视频在线免费 | 在线99热 | 国产经典一区二区三区 | 免费的毛片 | 国产乱子伦一区二区 | 黄色一二三区 | 狠狠操在线 | 久久久久久久久蜜桃 | 国产熟女高潮视频 | 亚州| 91亚洲国产成人久久精品麻豆 | 日本公与丰满熄 | 人妻少妇精品一区二区三区 | 一个人在线免费观看www | 日本人极品人妖高潮 | 日韩欧美超碰 | 天堂在线观看视频 | 国产黄色片子 | 双性受孕h堵精大肚生子 | 中文字幕在线播放第一页 | 黄色网址大全免费 | 夜夜嗨av| a级无毛片| 欧美影院在线 | 一区二区小说 | 色猫咪av在线 | 亚洲精品88 | 亚洲一区二区三区四区五区六区 | 中文字幕www | 日韩av区 | 老子影院午夜伦不卡大全 | 国产精品乱码妇女bbbb | 亚洲欧美日韩国产一区 | 日本理论中文字幕 | 日日干干| 亚洲精品乱码久久久久久麻豆不卡 | 亚洲中文无码久久 | 国产视频一区二区三区四区五区 | 亚洲精品一区二区在线 | 午夜影剧院 | 久热精品视频 | 人妻精品一区二区三区 | 色悠悠网址 | 国产成人亚洲综合a∨婷婷 台湾a级片 | jlzzjlzz亚洲日本少妇 | 女同性αv亚洲女同志 | 色播一区二区 | 亚洲淫 | 国产网站免费在线观看 | 国产精品久久毛片av大全日韩 | 国产盗摄一区二区三区 | 国产a v一区二区三区 | 日本黄色免费视频 | www.第四色 | 欧美极品在线观看 | 少妇一级淫片免费放中国 | 国产啪视频 | 伊人久操 | 亚洲天堂自拍 | 久久93 |