关键字'this'可以用来引用javascript中的计时器内部setInterval方法吗?



我已经知道javascript中的setInterval函数每隔固定的时间重复执行一个函数或一块代码。我已经知道它的语法如下:

setInterval(func|code, [delay], [arg1], [arg2], ...)

我的问题是:我可以使用关键字"this"作为参数来引用计时器id吗(在我的情况下,所有参数都作为外部回调函数的参数传递(?

提前谢谢。

在创建计时器之前,不能直接传递计时器的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传递

如果您愿意,您可以以任何一种方式将计时器ID作为this上下文传递,如果您的回调是一个正常函数:

对象

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);
}

只是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);
}
}
}

{//start the timer in a different scope
let timerId = setInterval(() => cb.call(timerId), 1000);
}

最新更新