为了账号安全,请及时绑定邮箱和手机立即绑定

setTimeout计时器值可以扩展

setTimeout计时器值可以扩展

烙印99 2021-04-13 12:15:37
我知道问这是基本而愚蠢的事,但是这个问题使我吃饱了。如果我有下面的以下代码。var timerVal = 900000function myFunction() {  setTimeout(function(){ alert("Hello"); }, timerVal);}myFunction()根据上述代码,警报将在15分钟后发出。但是十分钟后,我想通过将timerVal的值更改为1200000来将其延长5分钟。现在,警报将在另外10分钟后发出。即警报发出后总共20分钟,或警报发出15分钟之后总共20分钟。假设代码是这样的:var timerVal = 900000function myFunction() {  setTimeout(function(){ alert("Hello"); }, timerVal);}function change(){   setTimeout(function(){     timerVal = 1200000;   },60000);}myFunction();change();任何人都可以让我知道结果和简要说明的原因吗?
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

结果是,计时器将在900000毫秒标记处执行,尽管您尝试1200000通过更改timerVal变量的值将其更改为毫秒。


这是因为在JavaScript中它是按值传递的,并且由于您是900000最初传递的,因此计时器已在队列中排队,900000因此无法通过timerVal再次更改变量的值来更改。


因此,这段代码只是timerVal指向新数字,1200000而并没有真正更改先前设置的超时:


function change(){

   setTimeout(function(){

     timerVal = 1200000; //timerVal reference is pointing to a new number

   }, 60000);

}

要真正改变计时器的行为,您需要使用setTimeout调用返回的ID清除超时,并使用新的超时值创建另一个超时。


let timerVal = 9000;

function myFunction() {

  return setTimeout(function(){ alert("Hello"); }, timerVal); //returning the id

}

function change(id, newVal){

  clearTimeout(id); //clearing the previous timer using the id

  setTimeout(function(){ alert("Hello"); }, newVal);

}

let id = myFunction();

change(id, 5000);


查看完整回答
反对 回复 2021-04-22
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

AFAIU,您不能延长setTimeout的时间。您可以做的是阻止它执行,并使用新值创建另一个setTimeout。像这样:


var timer = setTimeout(()=>console.log("first"), 2000);


clearTimeout(timer);


var timer = setTimeout(()=>console.log("second"), 2000);

您无法扩展它,因为使用创建事件时变量具有的值来创建计时器。它不是可以不时评估的参考。这是一个固定值,仅在创建时评估。


查看完整回答
反对 回复 2021-04-22
  • 3 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信