2011-08-07 141 views
1

我对Javascript中的变量作用域感到困惑。我正在尝试使用Prototype库加载数据文件(.json),并使用json-sans-eval解析响应文本。问题是,在我看来,如果我试图访问Ajax.Request范围之外的“dataObj”,数据文件中的内容就会丢失。Javascript可变范围问题

Javascript中的变量有引用计数。我不明白全局变量'dataObj'怎么会丢失它的数据。任何提示或帮助?

谢谢!

var dataObj; 
function OnLoadHandle() { 
    new Ajax.Request('data.json', 
    { 
     method:'get', 
     onSuccess: function(transport) 
     { 
      var response = transport.responseText || "no response text"; 
      dataObj = jsonParse(response); 
      console.log(dataObj["[0,0]"]); // OK 
     }, 
     onFailure: function(){ alert('Something went wrong...') } 
    }); 
    console.log(dataObj["[0,0]"]); // ERROR 
} 
+5

这不是范围,问题是_A_jax是_A_synchronous,第二个'console.log'正在执行*在请求完成之前... – CMS

回答

6

console.log(...)在立即OnLoadHandle运行结束第二次调用,而内部的请求完成后,才onSuccess运行的一个。第二个console.log没有任何用处。

更广泛地说,这意味着将dataObj作为全局变量没有意义。它仅在onSuccess中分配后才有用,因此应该在onSuccess范围内作为局部变量。如果你在其他地方需要它,onSuccess应该将它作为参数传递给其他函数。

+0

谢谢你的回答。 – Unagi