猿问

setTimeout计时器值可以扩展

我知道问这是基本而愚蠢的事,但是这个问题使我吃饱了。如果我有下面的以下代码。


var timerVal = 900000

function myFunction() {

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

}

myFunction()

根据上述代码,警报将在15分钟后发出。但是十分钟后,我想通过将timerVal的值更改为1200000来将其延长5分钟。现在,警报将在另外10分钟后发出。即警报发出后总共20分钟,或警报发出15分钟之后总共20分钟。假设代码是这样的:


var timerVal = 900000

function myFunction() {

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

}

function change(){

   setTimeout(function(){

     timerVal = 1200000;

   },60000);

}

myFunction();

change();

任何人都可以让我知道结果和简要说明的原因吗?


烙印99
浏览 180回答 3
3回答

白猪掌柜的

结果是,计时器将在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);

宝慕林4294392

AFAIU,您不能延长setTimeout的时间。您可以做的是阻止它执行,并使用新值创建另一个setTimeout。像这样:var timer = setTimeout(()=>console.log("first"), 2000);clearTimeout(timer);var timer = setTimeout(()=>console.log("second"), 2000);您无法扩展它,因为使用创建事件时变量具有的值来创建计时器。它不是可以不时评估的参考。这是一个固定值,仅在创建时评估。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答