好吧,解决变量的快速方法只是在有问题的部分周围包装一个额外的函数:
(function()
{//wrapper function
var _redirectTimer;
function startRedirectTimer()
{
clearTimeout(_redirectTimer);
var redirectTimer = function(timeLeft) {
if(timeLeft == 0)
{
// redirect to application path
var redirectURL = window.location.protocol+"//"+window.location.host + "/" + location.pathname.split("/")[1];
window.location.replace(redirectURL);
return;
}
else
{
timeLeft--;
_redirectTimer = setTimeout(function () {redirectTimer(timeLeft)}, 1000);
}
}
redirectTimer(60);
})();//call wrapper function
与往常一样,您可以通过将超时函数公开给全局对象来选择何时调用超时函数。但是,如果我理解正确,您正在寻找一种方法以某种方式包含_redirectTimer
或链接到startRedirectTimer
函数(显然在每次调用后它不会丢失其状态)。这可以通过多种方式实现:
function startRedirectTimer()
{
//as you would, only: add this line
var _redirectTimer = startRedirectTimer._redirectTimer;
}
startRedirectTimer._redirectTimer;//functions are objects, so assign properties and methods at will
这些属性和方法与函数一样存在,因此它们的值不会在每次调用后重置。缺点:它们是可公开访问的,并且可以意外重新定义。
闭包最适合这种情况:
var startRedirectTimer = (function()
{
var _redirectTimer,timeLeft = 60;//initial value here
var redirectURL = window.location.protocol+"//"+window.location.host + "/" + location.pathname.split("/")[1];//
return function ()
{
clearTimeout(_redirectTimer);
if (timeLeft === 0)
{
return window.location.replace(redirectURL);
}
timeLeft--;
_redirectTimer = setTimeout(startRedirectTimer,1000);//just call the main function again
}
})();//return value of this function will be the actual startRedirectTimer function
要使用上面的代码进行设置,只需调用startRedirectTimer()
一次,它应该可以工作。这是未经测试的代码,这个,我今天有点发烧,但它应该。IMO,更少的代码,更高效。