最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解JS中定時(shí)器setInterval和setTImeout的this指向問題

 更新時(shí)間:2017年01月06日 10:47:07   作者:陌路黃昏后  
在js中setTimeout和setInterval都是用來定時(shí)的一個(gè)功能,下面這篇文章主要給介紹了JS中setInterval和setTImeout的this指向問題,文中通過示例介紹的很詳細(xì),有需要的朋友可以參考借鑒,一起來看看吧。

前言

Js是一個(gè)單線程語言,可以通過setTimeout()和setInterval()來設(shè)置代碼在指定時(shí)刻運(yùn)行,前者是在指定時(shí)間后執(zhí)行,后者是指每隔一段時(shí)間執(zhí)行。兩者的使用方法類似。

最近在練習(xí)寫一個(gè)小例子的時(shí)候用到了定時(shí)器,發(fā)現(xiàn)在setInterval和setTimeout中傳入函數(shù)時(shí),函數(shù)中的this會指向window對象,詳細(xì)的介紹通過一個(gè)示例展開,一起來看看吧。

如下例:

var num = 0;
function Obj (){
 this.num = 1,
 this.getNum = function(){
 console.log(this.num);
 },
 this.getNumLater = function(){
 setTimeout(function(){
  console.log(this.num);
 }, 1000)
 }
}
var obj = new Obj; 
obj.getNum();//1  打印的為obj.num,值為1
obj.getNumLater()//0  打印的為window.num,值為0

從上述例子中可以看到setTimeout中函數(shù)內(nèi)的this是指向了window對象,這是由于setTimeout()調(diào)用的代碼運(yùn)行在與所在函數(shù)完全分離的執(zhí)行環(huán)境上. 這會導(dǎo)致這些代碼中包含的 this 關(guān)鍵字會指向 window (或全局)對象。詳細(xì)可參考MDN setTimeout

但是在setTimeout中傳入的不是函數(shù)時(shí),this則指向當(dāng)前對象,如下例:

var num = 0;
function Obj (){
 this.num = 1,
 this.getNum = function(){
 console.log(this.num);
 },
 this.getNumLater = function(){
 setTimeout(console.log(this.num), 1000)
 }
}
var obj = new Obj; 
obj.getNum();//1  打印的為obj.num,值為1
obj.getNumLater()//1  打印的為obj.num,值為1

從以上兩個(gè)例子可以看出,當(dāng)在setTimeout中傳入的參數(shù)為函數(shù)時(shí),函數(shù)內(nèi)部的this才會指向window對象。

當(dāng)在setTimeout中傳入了一個(gè)函數(shù),若想要讓this指向正確的值,可以使用以下兩種比較常用的方法來使this指向正確的值:

1.將當(dāng)前對象的this存為一個(gè)變量,定時(shí)器內(nèi)的函數(shù)利用閉包來訪問這個(gè)變量

如下:

var num = 0;
function Obj (){
 var that = this; //將this存為一個(gè)變量,此時(shí)的this指向obj
 this.num = 1,
 this.getNum = function(){
 console.log(this.num);
 },
 this.getNumLater = function(){
 setTimeout(function(){
  console.log(that.num); //利用閉包訪問that,that是一個(gè)指向obj的指針
 }, 1000)
 }
}
var obj = new Obj; 
obj.getNum();//1  打印的為obj.num,值為1
obj.getNumLater()//1  打印的為obj.num,值為1

這種方法是將當(dāng)前對象的引用放在一個(gè)變量里,定時(shí)器內(nèi)部的函數(shù)來訪問到這個(gè)變量,自然就可以得到當(dāng)前的對象。

2.利用bind()方法

var num = 0;
function Obj (){
 this.num = 1,
 this.getNum = function(){
 console.log(this.num);
 },
 this.getNumLater = function(){
 setTimeout(function(){
  console.log(this.num);
 }.bind(this), 1000) //利用bind()將this綁定到這個(gè)函數(shù)上
 }
}
var obj = new Obj; 
obj.getNum();//1  打印的為obj.num,值為1
obj.getNumLater()//1  打印的為obj.num,值為1

bind()方法是在Function.prototype上的一個(gè)方法,當(dāng)被綁定函數(shù)執(zhí)行時(shí),bind方法會創(chuàng)建一個(gè)新函數(shù),并將第一個(gè)參數(shù)作為新函數(shù)運(yùn)行時(shí)的this。在這個(gè)例子中,在調(diào)用setTimeout中的函數(shù)時(shí),bind方法創(chuàng)建了一個(gè)新的函數(shù),并將this傳進(jìn)新的函數(shù),執(zhí)行的結(jié)果也就是正確的了。關(guān)于bind方法可參考 MDN bind

以上兩種方法都是比較常用的,當(dāng)然如果使用call或apply方法來代替bind方法,得到的結(jié)果也是正確的,但是call方法會在調(diào)用之后立即執(zhí)行,那樣也就沒有了延時(shí)的效果,定時(shí)器也就沒有用了,所以推薦使用上述兩種方法來將this傳進(jìn)setTimeout和setInterval中。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 關(guān)于js中removeEventListener取消事件監(jiān)聽的坑

    關(guān)于js中removeEventListener取消事件監(jiān)聽的坑

    許多入前端不久的人都會遇到removeEventListener無法清除監(jiān)聽的情況,下面這篇文章主要給大家介紹了關(guān)于js中removeEventListener取消事件監(jiān)聽的坑,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • js實(shí)現(xiàn)兩點(diǎn)之間畫線的方法

    js實(shí)現(xiàn)兩點(diǎn)之間畫線的方法

    這篇文章主要介紹了js實(shí)現(xiàn)兩點(diǎn)之間畫線的方法,涉及javascript圖形繪制的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 原來JS還可以這樣拆箱轉(zhuǎn)換詳解

    原來JS還可以這樣拆箱轉(zhuǎn)換詳解

    這篇文章主要給大家介紹了關(guān)于JS拆箱轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Bootstrap BootstrapDialog使用詳解

    Bootstrap BootstrapDialog使用詳解

    這篇文章主要為大家詳細(xì)介紹了Bootstrap BootstrapDialog使用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • JavaScript類型系統(tǒng)之正則表達(dá)式

    JavaScript類型系統(tǒng)之正則表達(dá)式

    正則又叫規(guī)則或模式,是一個(gè)強(qiáng)大的字符串匹配工具。javascript通過RegExp類型來支持正則表達(dá)式,本文給大家介紹javascript類型系統(tǒng)之正則表達(dá)式,對js正則表達(dá)式相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • JavaScript常用工具方法封裝

    JavaScript常用工具方法封裝

    今天小編就為大家分享一篇關(guān)于JavaScript常用工具方法封裝,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Bootstrap Table 在指定列中添加下拉框控件并獲取所選值

    Bootstrap Table 在指定列中添加下拉框控件并獲取所選值

    通過 bootstrap-table 的Column 配置項(xiàng)中的formatter,將獲取到的數(shù)據(jù)轉(zhuǎn)換為包含數(shù)據(jù)的 select 控件。然后根據(jù)用戶選擇項(xiàng)更新對應(yīng)單元格數(shù)據(jù),最后通過getallselection方法獲取所選行數(shù)據(jù)
    2017-07-07
  • JS實(shí)現(xiàn)多重選項(xiàng)卡切換輪播圖

    JS實(shí)現(xiàn)多重選項(xiàng)卡切換輪播圖

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)多重選項(xiàng)卡切換輪播圖制作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • EasyUi中的Combogrid 實(shí)現(xiàn)分頁和動態(tài)搜索遠(yuǎn)程數(shù)據(jù)

    EasyUi中的Combogrid 實(shí)現(xiàn)分頁和動態(tài)搜索遠(yuǎn)程數(shù)據(jù)

    jquery easyui中的combogrid比較特殊,算是combo和grid的組合,combogrid結(jié)合一個(gè)可編輯的文本框和下拉數(shù)據(jù)網(wǎng)格面板,可以讓用戶迅速找到并選擇,又可以進(jìn)行搜索,展示與當(dāng)前輸入的字符相匹配的數(shù)據(jù)。下面給大家介紹EasyUi中的Combogrid 實(shí)現(xiàn)分頁和動態(tài)搜索遠(yuǎn)程數(shù)據(jù)
    2016-04-04
  • 詳解vue.js根據(jù)不同環(huán)境(正式、測試)打包到不同目錄

    詳解vue.js根據(jù)不同環(huán)境(正式、測試)打包到不同目錄

    這篇文章主要介紹了詳解vue.js根據(jù)不同環(huán)境(正式、測試)打包到不同目錄,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07

最新評論

安远县| 井研县| 怀安县| 榆社县| 明水县| 遂宁市| 温宿县| 巨鹿县| 舟山市| 上高县| 天门市| 新丰县| 宁津县| 舟山市| 温宿县| 仁寿县| 邮箱| 吴桥县| 二连浩特市| 依安县| 博客| 缙云县| 双流县| 清河县| 邵东县| 文化| 云霄县| 二连浩特市| 潞城市| 平顶山市| 玉田县| 都昌县| 罗定市| 蚌埠市| 孝感市| 滕州市| 淮滨县| 阿克苏市| 灵丘县| 临泽县| 东乡县|