关键字'this'可以用来引用javascript中的timer insider setInterval方法吗
Can the keyword 'this' be used to refer the timer insider setInterval method in javascript
我已经知道 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);
}
我已经知道 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:
时为其创建包装函数,则只能向外部回调传递一个计时器 IDlet 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);
}