为什么Javascript全局变量不是全局的?

问题描述:

我有一个外部js文件处理删除某些元素。根据结果​​,我会确定是否需要刷新页面。为什么Javascript全局变量不是全局的?

var deleted = 0; // first assume not deleted 

$(function() { 
    $("#action a.action-delete").click(function() { 
     var id = $(this).parent().parent().attr("id"); 
     $.get("modify-sale.php", { "id" : id, "action" : "delete" }, function (data) { deleted = 1; }, "text"); 
     if (deleted) return true; // if success then refresh 
     else return false; // else does not refresh 
    }); 

没有问题是我无法改变的全局变量deleted在jQuery的事件处理程序。我可以保证删除操作是成功的,但是这个变量不会将其值更改为1.

为什么?

+2

你确定吗?或者你认为?由于Ajax的异步特性,在执行Ajax回调之前会执行'if(deleted)return true'。因此:你用调试器检查过这个值吗? – 2010-10-02 05:56:21

Ajax是异步的,因此它会在执行if else检查后设置deleted变量。试着把支票放回去。

$("#action a.action-delete").click(function() { 
    var id = $(this).parent().parent().attr("id"); 
    $.ajax({ 
     "url" : "modify-sale.php", 
     "type" : "GET", 
     "data" : { "id" : id, "action" : "delete" }, 
     "dataType" : "text", 
     "async" : false, 
     "success" : function(data) { 
      if (data == 'success') { 
       $("#msg").text("delete success").show(); 
       $("#msg").fadeOut(1000); 
       deleted = 1; 
      } else { 
       $("#msg").text("delete failed, plesase try later").show(); 
       $("#msg").fadeOut(5000); 
      } 
     }, 
     "error" : function() { 
      $("#msg").text("delete failed, please try later").show(); 
      $("#msg").fadeOut(5000); 
     } 
    }); 
    if (deleted) return true; 
    else return false; 
}); 

我修正了异步设置为同步。

+0

为什么你需要返回真或假?如果它没有被删除会发生什么?尽量避免同步请求。 – 2010-10-02 06:56:31