2012-01-01 64 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