2009-01-04 32 views
1

任何人都可以解釋我爲什麼:是什麼導致這些JavaScript驗證錯誤(隱含的全局和已定義的變種)?

function doAjax() { 
    var xmlHttpReq = false; 
    try { // Firefox, Opera 8.0+ and Safari 
     xmlHttpReq = new XMLHttpRequest(); 
    } 
    catch (e) { // Internet Explorer 
     try { 
      xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP"); 
     } 
     catch (e) { 
      try { 
       xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP"); 
      } 
      catch (e) { 
       alert("Your browser does not support AJAX. Please use an AJAX compatible browser."); 
       return false; 
      } 
     } 
    } 
    xmlHttpReq.open('GET', 'handler.php', true); 
    xmlHttpReq.onreadystatechange = function() { 
     if (xmlHttpReq.readyState == 4) { 
      var response = xmlHttpReq.responseText; 
      handleAjaxResponse(response); 
     } 
    }; 
    xmlHttpReq.send(null); 
    return true; 
} 

導致以下驗證錯誤:由JSlint.com

Error: 

Implied global: ActiveXObject 8, XMLHttpRequest 4, alert 15, handleAjaxResponse 24 

Problem at line 10 character 16: 'e' is already defined. 

catch (e) { 

Problem at line 14 character 20: 'e' is already defined. 

catch (e) { 

的JavaScript驗證

回答

4

這將是更明智的使用框架如jQuery(尤其是如果你認真想支持舊版本的IE(預V6)),但我會認爲有你不這樣做是有原因的。

這樣會更好,如果a)你不嵌套try-catches和b)你分解了一組函數,一個是獲取Xhr對象,另一個是使用Xhr對象來創建一個通用的ajax請求,外「doAjax」功能,執行要進行具體的AJAX調用: -

function getXHR() 
{ 
    var result = null 
    if (window.XMLHttpRequest) 
    { 
     result = new XMLHttpRequest(); 
    } 
    else 
    { 
     try { result = new ActiveXObject("MSXML2.XMLHTTP.3.0") } 
     catch (e) { } 

     if (result == null) 
     { 
      try { result = new ActiveXObject("Microsoft.XMLHTTP") } 
      catch (e) { } 
     } 
    } 
    return result; 
} 


function ajaxRequest(url, data, callBack) 
{ 
    var xmlHttpReq = getXHR(); 
    if (xmlHttpReq) 
    { 
     xmlHttpReq.open(data != null ? 'GET' : 'POST', url, true); 
     xmlHttpReq.onreadystatechange = function() 
     { 
      if (xmlHttpReq.readyState == 4) 
      { 
       //what happens if status is not 200 
       callBack(xmlHttpReq.responseText); 
      } 
     }; 
     xmlHttpReq.send(null); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

function doAjax() 
{ 
    var result = ajaxRequest('handler.php', null, handleAjaxResponse); 
    if (!result) alert("Your browser does not support AJAX. Please use an AJAX compatible browser."); 
    return result; 
} 

一個futher細化將是使回調接受XHR對象,而不是基本的responseText。這會給你更多的靈活性。如果回調函數只是想要文本,它可以使用此功能: -

function getTextFromXhr(xhr) 
{ 
    xhr.onreadystatechange = fnVoid; 
    if (xhr.status == 200) 
    { 
     return xhr.responseText; 
    } 
    else 
    { 
     throw {number: xhr.status, 
      description: xhr.statusText, 
      responseText: xhr.responseText 
     } 
    } 
} 
3

正在重用的變量e在每個試/ catch塊。嘗試重命名它們以避免碰撞。其他問題只是警告您正在使用需要在別處定義的事物。

+0

謝謝,所以重命名爲例如。 e1,e2和e3會更清潔嗎?它對我來說看起來並不是很乾淨 - 上面的例子是從我相信的W3C複製的。 – Tom 2009-01-04 16:22:37

+0

不,重命名'e's不會是「更清潔」。 JSLint顯示錯誤和警告。這些只是警告,通過使用'e',您可以使該塊中的前一個錯誤對象不可用。如果你需要第二個捕獲中的第一個'e',你會想要重命名。我會忽略這個警告。 – Prestaul 2009-01-04 16:29:34

1

的JSLint通常給出錯誤的很多...

已經被定義「E」似乎很清楚,我:)你用你所有的try-catch語句相同的變量。

5

關於第一個錯誤,這裏是一個exerpt from the JSLint Documentation

未定義變量和函數

JavaScript的最大問題是其 全局變量, 特別是隱含的全局變量的依賴。 如果變量未明確聲明 (通常使用var 語句),則JavaScript假定變量爲全局變量 。這可能是 面具拼寫錯誤的名稱和其他 問題。

JSLint期望在使用或調用 之前聲明所有變量和 函數。這使得它能夠檢測到隱含的全局變量。 也是很好的做法,因爲它使 程序更易於閱讀。

有時文件依賴於 全局變量和函數 在別處定義。通過包括 在你的文件,其中列出了 全局函數和對象,你 程序取決於評論您可以 識別這些到JSLint的,但並非 在程序或腳本 文件中定義。

全局聲明可以像 這樣:

/*global getElementByAttribute, breakCycles, hanoi */ 

全局聲明與 /*global開始。請注意,g之前沒有 的空間。只要你喜歡,你可以有 許多/*global評論。 它們必須出現在使用它們指定的變量 之前。

關於您的問題,下面的部分是最有可能幫助你修正錯誤:

一些全局可預定義 你。選擇瀏覽器 (瀏覽器)選項(請參閱下面的選項) 來預定義由web 瀏覽器提供的標準全局 屬性,例如窗口和文檔 和警報。選擇假設犀牛 (犀牛)選項,通過預定義的犀牛 環境提供的全球 性能。選擇假設一個雅虎的Widget (小部件)選項來預定義 由 雅虎提供的全局屬性小工具環境。

第二個錯誤給出,因爲你再使用變量「e」爲每個異常,包括嵌套的。重命名每個異常的變量以避免這種情況。