2

我正在尝试用 Javascript 构建一个非常简单的计时器(基于来自 HTML 表单的输入),但我的 clearTimeout 不起作用——甚至没有点击我拥有的 console.log。在我的 HTML 中,要调用 clearTimeout,我只有 . 我真的不确定为什么这不起作用 - 任何帮助将不胜感激!谢谢!

  function settimer(){

hour = document.getElementById('h').value;
minute = document.getElementById('m').value;
sec = document.getElementById('s').value;

hour = hour * 3600000;
minute = minute * 60000;
sec = sec * 1000;
totalTime = hour+minute+sec;

 var timer = setTimeout(function(){alert("Time's up"); }, totalTime);
 }

  function clear(){
    console.log("stopped")
    clearTimeout(timer);
  }
4

4 回答 4

4

使用时vartimer被声明为内部的局部变量,settimer()并且仅存在于函数的语句体内部。

为了允许两个函数共享对它的访问,必须在它们之外声明变量。settimer()仍然可以分配给它,但clear()也可以访问它。

// declare variable in surrounding scope
var timer;

function settimer() {
    // ...

    // assign to declared variable
    timer = setTimeout(function(){alert("Time's up"); }, totalTime);
}

function clear(){
    console.log("stopped")
    clearTimeout(timer);
}

注意:其他正在使用的变量,因为它们只在内部需要settimer(),所以应该声明为局部变量。

function settimer() {
    var hour = document.getElementById('h').value;
    var minute = document.getElementById('m').value;
    var sec = document.getElementById('s').value;

    hour = hour * 3600000;
    minute = minute * 60000;
    sec = sec * 1000;

    var totalTime = hour+minute+sec;

    // ...
}

通过根本不真正声明它们,它们将自动成为全局变量。

相关:var 关键字的作用是什么以及何时使用它(或省略它)?

于 2016-05-29T17:49:52.657 回答
3

你在一个函数中声明你的timer变量,所以它的作用域只是该函数的本地变量。不能在函数外调用。要解决此问题,请将变量移到函数之外。

在函数定义之外声明的变量是全局变量,它的值可以在整个程序中访问和修改。

在函数定义中声明的变量是局部变量。每次函数执行时都会创建和销毁,函数外的任何代码都不能访问它。

这是来自 Mozilla 开发者网络的文档

https://msdn.microsoft.com/library/bzt2dkta(v=vs.94).aspx

首先在任何函数之外声明timerand变量,赋予它本地范围。total_time

var timer;
var total_time;

现在,创建设置计时器的函数。请注意,我们希望使用var关键字使这些变量在范围内成​​为本地变量。

function setTimer(){

    var hour = +(document.getElementById('h').value) * 3600000;
    var minute = +(document.getElementById('m').value) * 60000;
    var sec = +(document.getElementById('s').value) * 1000;

    totalTime = hour + minute + sec;    // Assign total time to variable
    alert("Time's up");
}

将 timer 的值赋给setTimeout。我们现在可以使用totalTime变量作为时间量。

timer = setTimeout(setTimer, totalTime);

我们现在可以停止计时器,因为它已被赋予本地范围。

function clear() {
    console.log("stopped")
    clearTimeout(timer);
}

它现在应该可以工作了。再试一遍。

于 2016-05-29T17:47:58.643 回答
0

对此的简单解决方案。我已经硬编码了小时、分钟和秒的值,但是您总是可以从所需的位置获取它们

var 总时间;

 function settimer(){

    hour = 0;
    minute = 0;
    sec = 2;

    hour = hour * 3600000;
    minute = minute * 60000;
    sec = sec * 1000;
    totalTime = hour+minute+sec;

};

settimer();

 var timer = setTimeout(function(){
     alert("Time's up"); 
     clear();
  }, totalTime);




  function clear(){
    console.log("stopped")
    clearTimeout(timer);
  }
于 2016-05-29T17:58:12.697 回答
0

您可以timer在函数外部提升或实例化timer而不用将其var渲染为全局变量来声明它,以便外部函数可以访问它。

于 2017-12-13T00:29:52.940 回答