为什么Math.max(timeLeft / 1000,0)返回0作为最大值?

时间:2017-01-01 09:50:23

标签: javascript date local-storage

我想了解Math.max(timeLeft/1000,0);将其最大值恢复为0。我作为一个菜鸟做了很多研究。我阅读了关于数学及其所有方法的w3schools's教程。但是,返回0的值真的让我感到困惑。完整的代码如下。

var start = document.getElementById("start");
var dis = document.getElementById("display");
var finishTime;
var timerLength = 10;
var timeoutID;
dis.innerHTML = "Time Left: " + timerLength;
if(localStorage.getItem('myTime')){
    Update();
}
start.onclick = function () {
    localStorage.setItem('myTime', ((new Date()).getTime() + timerLength * 1000));
    if (timeoutID != undefined) window.clearTimeout(timeoutID);
    Update();
}

function Update() {
    finishTime = localStorage.getItem('myTime');
    var timeLeft = (finishTime - new Date());
    dis.innerHTML = "Time Left: " + Math.max(timeLeft/1000,0);
    timeoutID = window.setTimeout(Update, 100);
}

为什么window.setTimeout(Update, 100);在此代码中表现为setInterval

完整的工作代码为here

注意:我阅读了this article,并且我试图了解localstorage如何使用date函数。

另一个注意事项:上面的代码没有任何问题。它正在按预期工作。我只是想了解某段代码,这实在令人困惑。我现在明白为什么它会以0返回。

3 个答案:

答案 0 :(得分:3)

timeLeft为负数,因此0为最大值。

答案 1 :(得分:1)

当timeLeft为非正数时,

Math.max(timeLeft/1000, 0)返回0。

window.setTimeout(Update, 100)表现为setInterval,就像setInterval一样,它每100个循环调用一次。

答案 2 :(得分:1)

实际上Math.max并不总是返回零,否则你总会看到" 0"在显示范围内。仅当new Date()大于finishTime时(timerLength * 1000 ms = 10 * 1000 ms = 10 s之后),它才返回零。

关于setTimeout,考虑以下代码,f调用setTimeout,在1秒后调用f,调用setTimeout,依此类推:

function f () {
  setTimeout(f, 1000);
}

结果类似于setInterval但不完全相同。阅读以下文章,了解原因(作者:jQuery'父亲本人):http://ejohn.org/blog/how-javascript-timers-work/



var start = document.getElementById("start");
var dis = document.getElementById("display");
var finishTime;
var timerLength = 10;
var timeoutID;
var fakeStorage = (new Date()).getTime() + timerLength * 1000;
dis.innerHTML = "Time Left: " + timerLength;
if(fakeStorage){
  Update();
}
start.onclick = function () {
  fakeStorage = ((new Date()).getTime() + timerLength * 1000);
  if (timeoutID != undefined) window.clearTimeout(timeoutID);
  Update();
}

function Update() {
  finishTime = fakeStorage;
  var timeLeft = (finishTime - new Date());
  dis.innerHTML = "Time Left: " + Math.max(timeLeft/1000,0);
  timeoutID = window.setTimeout(Update, 100);
}

<button type="button" id="start">start</button>
<span id="display"></span>
&#13;
&#13;
&#13;