亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關鍵字'this'可以用來引用javascript中定時器內部的setInterval方法嗎

關鍵字'this'可以用來引用javascript中定時器內部的setInterval方法嗎

海綿寶寶撒 2023-07-29 14:57:24
我已經知道setIntervaljavascript中的函數每隔固定的時間重復執行一個函數或一段代碼。我已經知道它的語法如下:setInterval(func|code, [delay], [arg1], [arg2], ...)我的問題是:我可以使用關鍵字“this”作為參數來引用計時器 ID(我的例子中的所有參數都作為外部回調函數的參數傳遞)?提前致謝。
查看完整描述

1 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

在創建計時器之前,您不能直接傳遞計時器的 ID。問題是你必須調用 setInterval才能獲取 ID,然后才能將其實際傳遞給被調用的函數:


let timerId = setInterval(function() {}, 1000, timerId); 
//error - we are using `timerId` before its declaration is finished

傳遞一個對象

但是,您可以利用對象在共享相同引用的情況下工作的方式。因此,您可以初始化一個對象,這意味著該變量存在,然后調用setInterval并將計時器ID記錄為該對象的屬性。然后將該對象作為參數傳遞給回調。當回調執行時,對象屬性肯定會被填充,您可以只使用其中的值:


let cb;


{ //callback in one scope

  

  //simple counter that stops at zero

  let i = 3;

  cb = timerContext => {

    console.log(i--);

    if (i < 0) {

      console.log("finish");

      clearInterval(timerContext.timerId);

    }

  }

}



{//start the timer in a different scope

  let context = { timerId: null };

  

  context.timerId = setInterval(cb, 1000, context);

}

創建一個包裝器

或者,如果您在調用 setInterval 時為其創建包裝函數,則只能向外部回調傳遞計時器 ID:


let cb;


{ //callback in one scope

  

  //simple counter that stops at zero

  let i = 3;

  cb = timerId => {

    console.log(i--);

    if (i < 0) {

      console.log("finish");

      clearInterval(timerId);

    }

  }

}



{//start the timer in a different scope

  let timerId = setInterval(() => cb(timerId), 1000);

}

傳遞為this

this如果您愿意,如果您的回調是普通函數,則可以以任一方式將計時器 ID 作為上下文傳遞:

目的

let cb;


{ //callback in one scope

  

  //simple counter that stops at zero

  let i = 3;

  cb = function() {

    console.log(i--);

    if (i < 0) {

      console.log("finish");

      clearInterval(this.timerId);

    }

  }

}



{//start the timer in a different scope

  let context = { timerId: null };

  

  context.timerId = setInterval(cb.bind(context), 1000);

}

只要身份證號

let cb;


{ //callback in one scope

  

  //simple counter that stops at zero

  let i = 3;

  cb = function() {

    console.log(i--);

    if (i < 0) {

      console.log("finish");

      clearInterval(this);

    }

  }

}



{//start the timer in a different scope

  let timerId = setInterval(() => cb.call(timerId), 1000);

}


查看完整回答
反對 回復 2023-07-29
  • 1 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號