2012-01-01 69 views
2

我很好奇,为什么这是行不通的,下面的代码:如何用ajax更改此变量?

function Ajax(sUrl, fCallback) { 

    var url = sUrl || ''; 
    var callback = fCallback || function() {}; 
    var xmlhttp = (function() { 
     if (window.XMLHttpRequest) { 
      return new XMLHttpRequest(); 
     } else if (window.ActiveXObject) { 
      try { 
       return new ActiveXObject("Msxml2.XMLHTTP.6.0"); 
      } catch (e) { 
       try { 
        return new ActiveXObject("Msxml2.XMLHTTP.3.0"); 
       } catch (err) { 
        return new ActiveXObject("Microsoft.XMLHTTP"); 
       } 
      } 
     } else { 
      return null; 
     } 
    }()); 

    this.setUrl = function (newUrl) { 
     url = newUrl; 
    }; 

    this.setCallback = function (func) { 
     callback = func; 
    }; 

    this.request = function (method, data) { 
     if (xmlhttp === null) { return false; } 

     xmlhttp.onreadystatechange = function() { 
      if (xmlhttp.readyState === 4) { 
       callback(xmlhttp.status, xmlhttp.responseXML, xmlhttp.responseText); 
      } 
     }; 

     data = data || ''; 
     data = encodeURIComponent(data); 
     if ((/post/i).test(method)) { 
      xmlhttp.open('POST', url); 
      xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
      xmlhttp.send(data); 
     } else { 
      var uri = data === '' ? url : url + '?' + data; 
      xmlhttp.open('GET', uri); 
      xmlhttp.send(); 
     } 

     return true; 
    }; 

    return this; 

} 

var ajax = new Ajax(''); // sets the url, not necessary for this demonstration 
var changed = false; 

function change() { 
    changed = true; 
} 

function foo() { 
    ajax.setCallback(change); 
    ajax.request(); 
    alert(changed); 
} 

foo(); 

这里有一个小提琴:http://jsfiddle.net/dTqKG/

我觉得像change功能将创建一个闭包的确会更改changed变量。有谁知道发生了什么事?

+0

撇开:你不需要从你作为构造函数调用的函数中返回'this':这将自动发生,通常的做法是让它自动发生(只是不要返回还要别的吗)。 – nnnnnn 2012-01-01 10:26:46

+0

@nnnnnn,我想我同意。 。 。看起来我一直在读太多的Crockford @ _ @谢谢! – dunnza 2012-01-02 12:24:35

回答

1

ajax.request();将在调用change()之前返回。这是AJAX调用的异步性质,以及您需要回调的原因,而不是仅从send()方法获取返回值。
除此之外,代码中可能还有其他一些问题。我问你为什么不使用现成的许多AJAX框架之一,而不是自己编写。

+0

谢谢你,我保持它不同步,它的工作。我没有使用图书馆的原因是为了学习经验,而且我真的不需要有一个能够提供比我需要的更多功能的图书馆。我想这种方式更轻量。不过,我确实并不明白你的解释为什么是正确的。 。 。再次感谢! – dunnza 2012-01-01 08:37:03

+1

不是真的AJAX,如果你不让它异步! – Bruce 2012-01-01 09:31:45

+0

@Zach我想这将是一个关于** async **调用的很好的学习。你的代码看起来足够精细,我认为你试图重新发明轮子:) – 2012-01-01 16:56:38