2011-11-29 95 views
0
function calcage(secs, num1, num2) { 
    s = ((Math.floor(secs/num1))%num2).toString(); 
    if (LeadingZero && s.length < 2) 
    s = "0" + s; 
    return s; 
} 
function CountBack(secs) 
{ 
    if (secs < 0) { 
    document.getElementById("cntdwn").innerHTML = FinishMessage; 
    return; 
    } 
    DisplayStr = DisplayFormat.replace(/%%D%%/g, calcage(secs,86400,100000)); 
    DisplayStr = DisplayStr.replace(/%%H%%/g, calcage(secs,3600,24)); 
    DisplayStr = DisplayStr.replace(/%%M%%/g, calcage(secs,60,60)); 
    DisplayStr = DisplayStr.replace(/%%S%%/g, calcage(secs,1,60)); 
    document.getElementById("cntdwn").innerHTML = DisplayStr; 
    if (CountActive) 
    setTimeout("CountBack(" + (secs+CountStepper) + ")", SetTimeOutPeriod); 
} 
function putspan() { 
    document.write("<span id='cntdwn'></span>"); 
} 
if (typeof(TargetDate)=="undefined") 
    TargetDate = "12/31/2020 5:00 AM"; 
if (typeof(DisplayFormat)=="undefined") 
    DisplayFormat = "%%D%% days, %%H%% hours, %%M%% minutes, %%S%% seconds"; 
if (typeof(CountActive)=="undefined") 
    CountActive = true; 
if (typeof(FinishMessage)=="undefined") 
    FinishMessage = "Finished."; 
if (typeof(CountStepper)!="number") 
    CountStepper = -1; 
if (typeof(LeadingZero)=="undefined") 
    LeadingZero = true; 

CountStepper = Math.ceil(CountStepper); 
if (CountStepper == 0) 
    CountActive = false; 
var SetTimeOutPeriod = (Math.abs(CountStepper)-1)*1000 + 990; 
putspan(); 
var dthen = new Date(TargetDate); 
var dnow = new Date(); 
if(CountStepper>0) 
    ddiff = new Date(dnow-dthen); 
else 
    ddiff = new Date(dthen-dnow); 

gsecs = Math.floor(ddiff.valueOf()/1000); 

CountBack(gsecs); 

如果我把这个代码里面jQuery(function(){});我得到:功能没有定义

ReferenceError: CountBack is not defined 

为什么?

回答

3

如果在闭包中定义了CountBack,那么setTimeout将评估的javascript字符串将无法访问它。 setTimeouteval()全局范围内的字符串参数。

千万不要将字符串传递给setTimeout取而代之:

if (CountActive) 
    setTimeout(function(){CountBack(secs+CountStepper);}, SetTimeOutPeriod); 
0

将字符串传递给setTimeout会中断作用域(它将在全局作用域而不是当前作用域中进行评估)。改为传递一个函数。