2016-05-29 75 views
1

我想在Javascript中建立一个非常简单的计时器(基于来自HTML表单的输入),并且我的clearTimeout不工作 - 甚至没有打到我有的console.log 。在我的HTML中,为了调用clearTimeout,我只是有。我真的不知道为什么这不起作用 - 任何帮助将不胜感激!谢谢!clearTimeout()不停止setTimeout

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); 
    } 
+7

'var timer'只存在于'settimer()'内部。它需要在函数之外声明,以便它们都可以访问它。 –

回答

3

您声明一个函数内部timer变量,所以它的范围仅仅是局部的功能。它不能在函数外调用。要解决这个问题,请将该变量移到您的函数之外。

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

在函数定义中声明的变量是本地的。它在每次执行该功能时被创建和销毁,并且不能被功能之外的任何代码访问。

下面是从Mozilla开发者网络

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

文档首先声明timertotal_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"); 
} 

将定时器的值分配给setTimeout。我们现在可以使用totalTime变量作为时间量。

timer = setTimeout(setTimer, totalTime); 

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

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

它现在应该工作。再试一次。

+0

谢谢,理查德。我试过,但我得到一个错误,然后说totalTime没有定义......我也试着将所有东西都移到settimer()函数中,但是这并不起作用,要么.. – bjorkland

+0

刚刚意识到你没有声明totalTime。您还需要声明,以便在另一个功能中使用 –

+0

谢谢,理查德!现在它工作得很好。原来,我还需要更改函数的名称 - 我认为明确是一个保留字? – bjorkland

2

当使用var时,timer被声明为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; 

    // ... 
} 

通过不真正宣布他们,他们会自动成为全局变量。

相关:What is the function of the var keyword and when to use it (or omit it)?

0

简单的解决这个。我已经对小时,分钟和秒的值进行了硬编码,但是您可以随时从所需的位置获取它们

var totalTime;

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); 
    } 
0

您可以扯起timer外的函数或实例timer而不var宣布它使之成为全局变量,以便它可以被外部函数访问。