2011-03-02 113 views
2

我遇到了javascript全局变量(称为TimeStamp)未定义onload的问题......至少我认为这是问题所在。Javascript可变范围

我从这开始,定义TimeStamp。

 $(document).ready(function(){ 
     // AddTest(); 
     var TimeStamp = null; 
     waitForMsg(); 
    }); 

... waitForMsg然后使用TimeStamp运行并在成功完成ajax调用后更新它。至少这是这个想法,但目前没有任何运行,因为“TimeStamp没有定义”......即使我早些时候定义它! (urgh)。

如果我在waitForMsg中重新定义Timestamp,它只是被重置,而不是使用successfull ajax函数中的更新值。

function waitForMsg(){ 


    $.ajax({ 
     type: "POST", 
     url: "backend.php", 
     async: true, 
     cache: false, 
     timeout:50000, /* Timeout in ms */ 
     data: "TimeStamp=" + TimeStamp, 
     success: function(data){ 

      var json = eval('(' + data + ')'); 

      $('#TextHistory :last-child').after('<p>' + json['msg'] + '</p>'); 


      TimeStamp = json['timestamp']; 


      setTimeout(
       'waitForMsg()', /* Request next message */ 
       1000   /* ..after 1 seconds */ 
      ); 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown){ 

      $('#TextHistory :last-child').after('<p>' + errorThrown + '</p>'); 

      setTimeout(
       'waitForMsg()', /* Try again after.. */ 
       "15000");  /* milliseconds (15seconds) */ 
     }, 
    }); 
}; 

与往常一样,任何帮助非常感谢。

丹。

回答

2

变化

$(document).ready(function(){ 
    // AddTest(); 
    var TimeStamp = null; 
    waitForMsg(); 
}); 

var TimeStamp = null; 
$(document).ready(function(){ 
    // AddTest(); 
    waitForMsg(); 
}); 

这样的将生活在全球范围内,而不是只是在准备功能的范围。

作为进一步的说明,您应该将setTimeout语句从setTimeout(string to eval,delay)更改为setTimeout(function reference to run, delay)。像这样:

setTimeout(waitForMsg,1000); 

所以你避免不必要的eval电话。

更进一步,考虑改变

var json = eval('(' + data + ')'); 

var json = JSON && JSON.parse ? JSON.parse(data) : eval('(' + data + ')'); 

,让你得到原生JSON解析的好处在现代浏览器。

更妙的是,让jQuery的反序列化JSON的为你通过Ajax调用添加dataType: 'json'为参数:)

+0

Niiii​​。全球化是邪恶的。 – Quentin

+0

并非总是如此,它解决了眼前的问题。当你使用jQuery时,jQuery和$是全局变量,你会发现那个邪恶吗? –

+0

谢谢!!!!!愚蠢的我认为把它放在那里确实宣布它是全球性的。 –

0

不通过字符串被evaled。这是一种低效,难以调试和休息范围:

setTimeout('waitForMsg()',1000); 

不要传递功能:

setTimeout(waitForMsg,1000); 
0

你必须定义在页面范围内的任何功能之外VAR时间戳。

当您在一个代码块中定义一个变量时,它只会在相同的'level'处可见,并且在您从该代码块调用的方法中不可见。

当您在ajax调用中向TimeStamp变量写入值(并且未使用'var'定义它时),它将自动定义或重用页面范围中的TimeStamp变量,但是由于您尝试读取TimeStamp(数据:“TimeStamp =”+ TimeStamp)变量,然后它会生成'未定义'错误。

反正:考虑避免使用页面范围变量的可能性。