在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/C  HTML/ 關(guān)于setTimeout的問(wèn)題

關(guān)于setTimeout的問(wèn)題

具體問(wèn)題就是setTimeout里面執(zhí)行方法本身的時(shí)候,直接寫(xiě)方法名會(huì)報(bào)錯(cuò),也許是我搜索的方式不對(duì),沒(méi)有搜到相關(guān)答案。
this.timer = setTimeout(self.change, this.s); 這樣寫(xiě)會(huì)報(bào)錯(cuò)
寫(xiě)這個(gè)是為了實(shí)現(xiàn)字體不停變色。

function ChangeColor(id,arr,s) {
    this.id = id;
    this.arr = arr;
    this.s = s;
    this.i = 0;
    this.timer = null;
}

ChangeColor.prototype = {
    change : function () {
        let self = this;
        if (this.arr[this.i]) {
            $(this.id).css('color', this.arr[this.i]);
        }

        this.i === 0 ? this.i++ : this.i = 0;
        // this.timer = setTimeout(self.change, this.s);
        this.timer = setTimeout(function () {
            // console.log(self);
            self.change();
        }, this.s);
    }
};

let txt = new ChangeColor('.txt',['#fff','#000'],200);
txt.change();

謝謝

回答
編輯回答
檸檬藍(lán)

你這不是遞歸了嗎。
遞歸的話沒(méi)有邊界,跑一會(huì)內(nèi)存會(huì)蹦。
在change 函數(shù)外面用定時(shí)器調(diào)用

2018年2月5日 05:25
編輯回答
假灑脫

如果僅僅是需要達(dá)到這個(gè)效果,不一定用你的方法,你可以采用循環(huán)定時(shí)器觸發(fā)。
然后在相應(yīng)處理中去操作具體的對(duì)象屬性值,達(dá)到效果。

2017年2月14日 08:30
編輯回答
裸橙

樓上說(shuō)的是對(duì)的,這是關(guān)于this的指向的問(wèn)題,要搞清楚this是在運(yùn)行時(shí)進(jìn)行綁定的,并不是在編寫(xiě)時(shí)綁定,它的上下文取決于函數(shù)調(diào)用時(shí)的各種條件,this的綁定和函數(shù)聲明的位置沒(méi)有任何關(guān)系,只取決于函數(shù)的調(diào)用方式。具體可以看下我總結(jié)的一篇讀書(shū)筆記JavaScript基礎(chǔ)系列--打敗this

第一次直接調(diào)用txt.change()的時(shí)候,this指向txt這個(gè)對(duì)象,所以self也指向txt這個(gè)對(duì)象,所以初始化的時(shí)候運(yùn)行正常。
setTimeout的回調(diào)的調(diào)用位置始終是全局作用域,所以回調(diào)里面的this是指向全局對(duì)象---瀏覽器里是window對(duì)象,現(xiàn)在你把self.change作為setTimeout的回調(diào),那么定時(shí)器到點(diǎn)觸發(fā)后,回調(diào)self.change里的this就指向window了,而window是沒(méi)有arr,i這些屬性的,所以執(zhí)行到if (this.arr[this.i])時(shí)會(huì)報(bào)錯(cuò):Cannot read property 'undefined' of undefined

2017年6月11日 04:09
編輯回答
擱淺

樓上說(shuō)的是對(duì)的,這是關(guān)于this的指向的問(wèn)題,要搞清楚this是在運(yùn)行時(shí)進(jìn)行綁定的,并不是在編寫(xiě)時(shí)綁定,它的上下文取決于函數(shù)調(diào)用時(shí)的各種條件,this的綁定和函數(shù)聲明的位置沒(méi)有任何關(guān)系,只取決于函數(shù)的調(diào)用方式。具體可以看下我總結(jié)的一篇讀書(shū)筆記JavaScript基礎(chǔ)系列--打敗this

txt.change()

第一次直接調(diào)用的時(shí)候,this指向txt這個(gè)對(duì)象,所以self也指向txt這個(gè)對(duì)象,所以初始化的時(shí)候運(yùn)行正常。
setTimeout的回調(diào)的調(diào)用位置始終是全局作用域,所以回調(diào)里面的this是指向全局對(duì)象---瀏覽器里是window對(duì)象,現(xiàn)在你把self.change作為setTimeout的回調(diào),那么定時(shí)器到點(diǎn)觸發(fā)后,回調(diào)self.change里的this就指向window了,而window是沒(méi)有arr,i這些屬性的,所以執(zhí)行到if (this.arr[this.i])時(shí)會(huì)報(bào)錯(cuò):Cannot read property 'undefined' of undefined

2018年5月9日 18:12
編輯回答
空白格
//修改
this.timer = setTimeout(this.change.bind(this), this.s);

初始化運(yùn)行正常,定時(shí)器觸發(fā)后,change函數(shù)作為setTimeout的回調(diào)函數(shù),此時(shí)this指向了window,執(zhí)行this.arr[this.i]報(bào)錯(cuò).

最后,函數(shù)調(diào)用是txt.change(),不是txt.changeColor()

2017年8月11日 03:44