声明全局变量

时间:2012-06-04 11:22:32

标签: javascript jquery ajax

我知道这个问题已经被问了几百次,所以我很抱歉。

我查看了所有其他示例,我不明白为什么以下代码现在无效。

当我将它放在CheckinMap函数之外时,我得到了未定义的警告框。

为什么?

$(document).ready(function() { 
    var MapData;
        $(function CheckinMap() {
                $.ajax({
                    type: "GET",
                    url: "content/home/index.cs.asp?Process=ViewCheckinMap",
                    success: function (data) {
                        MapData = data;
                    },
                    error: function (data) {
                        $("#checkinmap").append(data);
                    }
                });
            });
    alert(MapData);
    }); 

2 个答案:

答案 0 :(得分:7)

MapData未定义,因为在{ajax调用仍在运行时执行alert(ajax是异步的)并且响应尚不可用。所以以这种方式改变你的代码

 success: function (data) {
         MapData = data;
         alert(MapData);
 },

或继续执行代码执行调用另一个函数

 success: function (data) {
         continueExecution(data)
 },
 ...

 function continueExecution(data) {
     alert(data)
 }

或使用延迟对象(在jQuery 1.5 +上)

$.ajax({
   type: "GET",
   url: "content/home/index.cs.asp?Process=ViewCheckinMap"
})
.done(function(data) { alert(data) })

答案 1 :(得分:0)

执行顺序是异步的。目前执行以下步骤:

  1. Ajax call
  2. 警报(属于MapData); //未知
  3. 设置MapData(或者甚至没有设置MapData的错误函数)的成功函数
  4. 您可以在成功函数中提醒(如建议的那样),但是您不知道该变量是该函数的本地变量还是实际上是全局的。要测试MapData是否实际上是全局的,您可以使用setTimeout来警告变量。

    查看此修改后的示例代码:

    // Global variable
    var MapData;
    
    // Global function
    function test() {
      alert(MapData);   
    }
    
    $(document).ready(function() {
        $.ajax({
            type: "GET",
            url: "http://www.google.nl",
            success: function (data) {
                MapData = data;
    
                // Call global function with timeout
                setTimeout(test, 10);
            },
            error: function (data) {
                $("#checkinmap").append(data);
    
                // Set error message instead of data (for testing)            
                MapData = 'error';
    
                // Call global function with timeout
                setTimeout(test, 10);
            }
        });
    });
    

    或者你可以在这里测试一下:http://jsfiddle.net/x9rXU/