2009-08-14 78 views
2

我以为我有这种混乱在我脑海中整理出来,但由于某种奇怪的原因,它不工作。Javascript本地vs全球

如果你在一个函数/范围之外声明一个变量,并且在一个函数内没有引用var,那么它会改变先前声明的变量......对吗?

但是,第一次警报返回正确的价格,但第二次(最后一次)警报返回0.我做错了什么?

//get pricing 
var price=0; 
var modelid = $("#model_input").val(); 
var inCode = $("#code_input").val(); 
$.get("getpricing.php", { 'modelid': modelid ,'code' : inCode }, function(data){ 
    price = data; 
    alert(price); 
}); 
alert(price); 
+0

您是否定义了一个价格变量,该函数被馈送给$ .get? – 2009-08-14 04:54:39

+0

@meder:回调函数就在代码中...没有没有额外的声明 – 2009-08-14 04:56:41

回答

8

您正在使用A jax请求。

那些未指定的地方是A同步:它们在后台执行,而不停止执行脚本的其余部分。

因此,最后一行代码上的alert在Ajax请求完成之前执行;这意味着当时price仍然是0。

改变这种情况的一种方法是使用同步请求(请参阅async option);但我强烈建议不要这样做;引用该文档:

缺省情况下,所有的请求被发送 异步(即这是通过默认设置为true )。如果您需要同步 请求,请将此选项设置为false。 请注意,当 请求处于活动状态时,同步请求可能会暂时锁定浏览器 以禁用任何操作。

而你绝对不希望你的应用程序冻结整个浏览器!

您应该重新考虑应用程序的设计方式,在这种情况下:您只能在完成Ajax请求后使用“价格”信息 - 这可能意味着您应该在调用的函数内放置更多代码它的成功:仅仅在$.get之后放置代码是不够的。

3

HTTPRequests的使用不用彷徨是异步的,从而为请求的回调尚未触发第一个警报(第二宣)会提醒原始值。

+0

奇怪。我实际上并没有使用价格变量,直到后来出现If和For循环(基本上是大量的线下来)。但到那时,它还没有接受我所假设的呼叫。如果我只是改变发布会按预期工作吗? – rideon88 2009-08-14 04:59:19

+0

号码后,获取仍然是异步的 – 2009-08-14 05:05:08