1 回答

TA貢獻(xiàn)2021條經(jīng)驗 獲得超8個贊
在創(chuàng)建計時器之前,您不能直接傳遞計時器的 ID。問題是你必須調(diào)用 setInterval
才能獲取 ID,然后才能將其實際傳遞給被調(diào)用的函數(shù):
let timerId = setInterval(function() {}, 1000, timerId); //error - we are using `timerId` before its declaration is finished
傳遞一個對象
但是,您可以利用對象在共享相同引用的情況下工作的方式。因此,您可以初始化一個對象,這意味著該變量存在,然后調(diào)用setInterval并將計時器ID記錄為該對象的屬性。然后將該對象作為參數(shù)傳遞給回調(diào)。當(dāng)回調(diào)執(zhí)行時,對象屬性肯定會被填充,您可以只使用其中的值:
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);
}
創(chuàng)建一個包裝器
或者,如果您在調(diào)用 setInterval 時為其創(chuàng)建包裝函數(shù),則只能向外部回調(diào)傳遞計時器 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
如果您愿意,如果您的回調(diào)是普通函數(shù),則可以以任一方式將計時器 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);
}
添加回答
舉報